记录学习笔记、分享资源工具、交流技术思想、提升工作效率

跨平台解压文件时中文乱码问题

运维 xiaomudk 6年前 (2015-04-23) 1097次浏览 0个评论
文章目录[隐藏]

最后公司项目代码更新。项目文件存在中文文件名。在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()

发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址