Home > 基础知识 > 正文

【工作】解决Linux系统使用unzip解压后中文名乱码问题

写在前面:

之前的一些工作遇到的问题都是以笔记的形式记录,现在开了博客后,打算把之前觉得有用的笔记放到博客上,帮助别人的同时,自己没事还能温故知新一下,一举两得。

问题现象:

如文章标题所说,Linux系统使用unzip解压zip软件包后,中文名乱码
 

问题原因:

此问题是由于zip格式的缺陷,zip文件格式中没有字段标志出文件名的编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,由于zip文件中没有声明其编码,所以 linux上的unzip一般以默认编码UTF8解压,因此,导致这些zip文件在Linux下解压时出现中文文件名乱码。
 
注:目前发现5.52版本unzip有这问题,6.00以上版本会自动转换编码
 

解决办法一,利用pyton来处理

# vi uzip
 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# uzip.py
 
import os
import sys
import zipfile
 
print "Processing File " + sys.argv[1]
 
file=zipfile.ZipFile(sys.argv[1],"r");
for name in file.namelist():
    utf8name=name.decode('gbk')
    print "Extracting " + utf8name
    pathname = os.path.dirname(utf8name)
    if not os.path.exists(pathname) and pathname!= "":
        os.makedirs(pathname)
    data = file.read(name)
    if not os.path.exists(utf8name):
        fo = open(utf8name, "w")
        fo.write(data)
        fo.close
file.close()
# chmod +x uzip
# ./uzip xxxx.zip
 

方法2,通过unzip行命令解压,指定字符集,但一些unzip是没有-O这个选项的

# unzip -O CP936 xxx.zip (用GBK, GB18030也可以)
 

方法3,在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件

# vim /etc/environment中加入2行
UNZIP=”-O CP936″
ZIPINFO=”-O CP936″
 
我是用方法一解决的,其他两种方法思路相同,测试后没有效果,但是网上有人说可以,估计跟系统或者软件版本有关,此处仅作为记录。
上一篇:【实战】MySQL数据库的优化
下一篇:【工作】Zabbix 高可用架构的实现
【分享】TCP/IP和Socket的区别

【分享】TCP/IP和Socket的区别

【工作】Linux 实用的端口转发工具:socat安装使用记录

【工作】Linux 实用的端口转发工具:socat安装使用记录

【工作】Linux 用于内网主机名和IP解析的DNS主从集群服务部署

【工作】Linux 用于内网主机名和IP解析的DNS主从集群服务部署

【工作】生产环境中MySQL Drop 删除(百G级、T级)大表的解决方法

【工作】生产环境中MySQL Drop 删除(百G级、T级)大表的解决方法

【工作】Nginx 实现域名的登录验证功能

【工作】Nginx 实现域名的登录验证功能

【工作】Centos 6.5 PHP 5.3 yum升级到5.5、5.6、5.7版本方法

【工作】Centos 6.5 PHP 5.3 yum升级到5.5、5.6、5.7版本方法

【工作】线上Nginx升级OpenSSL版本防止安全漏洞

【工作】线上Nginx升级OpenSSL版本防止安全漏洞

发表评论

昵称 *
邮箱 *
网址

沙发空闲中,快来抢!