最后公司项目代码更新。项目文件存在中文文件名。在win下打成zip包后,在linux解压出来就会乱码。网上查了一下资料,原来是win下打包的zip,文件名是GBK编码。而在linux上却是utf-8编码。既然zip包会乱码,索性测试一下其它的压缩类型会不会乱码。
一、不同的压缩包类型跨平台时中文乱码测试
1.常用的压缩包类型
- zip
- rar
- 7z
- tar(tar只是打包,并没有压缩文件)
- tar.gz
- tar.bz2
2.测试过程
以上压缩包类型,分别在win打包后(打包工具为winrar和7z),在linux解压来查看是否有乱码.
下面是要打包的文件
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 互动和聊天
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 任务脚本
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 公告邮件
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 参数配置脚
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 技能数据
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 推送消息
-rw-r--r-- 1 xiaomu 10513 161K Apr 28 20:02 敏感字库.xls
-rw-r--r-- 1 xiaomu 10513 30K Apr 28 20:02 程序配置.xls
-rw-r--r-- 1 xiaomu 10513 742 Apr 28 20:02 维护说明.txt
drwxr-xr-x 1 xiaomu 10513 0 Apr 28 20:02 道具相关
-rw-r--r-- 1 xiaomu 10513 66 Apr 28 20:02 重要说明.txt
-rw-r--r-- 1 xiaomu 10513 8.3K Apr 28 20:02 问题列表.txt.txt
3.测试结果
压缩包类型 | 在linux使用的解压工具 | 是否乱码 |
---|---|---|
zip | unzip | 是 |
rar | unrar | 否 |
7z | 7z | 否 |
tar | tar | 是 |
tar.gz | tar | 是 |
tar.bz2 | tar | 是 |
二、解决方案
1.尽量使用rar或者7z的压缩格式
2.对于tar、tar.gz、tar.bz2格式
使用tar解压后,可以使用convmv转换文件名编码
convmv -f 源编码 -t 新编码 [选项] 文件名
常用的选项有:
-r
递归处理子文件夹
--notest
真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
--unescape
可以做一下转义,比如把%20变成空格,如果你不知道这是在做什么,就不要尝试了。
3. 对于zip格式
zip格式用unzip解压,再用convmv来转换编码未能成功。下面给出几种网上查到的解决方案:
1). 使用7z来解压,再使用convmv来转码
# LANG=C 7z x file.zip
# convmv -f gbk -t utf8 -r --notest file
2). 使用python脚本来解决
#!/usr/bin/env python
# -*- coding: utf-8 -*-
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()