解决Ubuntu中解压Windows下的zip文件时乱码问题
三种方法 :
1.通过指定字符集解压:
1 | unzip -O CP936 file.zip #将file修改成你要解压的压缩包名 |
2.环境变量中指定参数:
1)打开环境变量文件1
sudo gedit /etc/environment
2)在文件中添加两行内容后并保存:1
2UNZIP="-O CP936"
ZIPINFO="-O CP936"
3)使上一步的更改生效(此步骤一定要做):
1 | source /etc/environment |
3.使用其他的解压工具unar:
1 | sudo apt install unar |
1. 分析
1.1 zip解压时文件乱码
本质问题还是zip格式的缺陷,没有字段标志出文件名的编码格式。
ZIP在压缩与解压缩的时候默认使用了系统的本地编码,如windows中文环境下的编码多为gbk,gb2312,日文环境下是JIS,linux默认编码为UTF8等;那么在不同系统环境下,只要压缩与解压缩的编码不一致,就会出现乱码。1乱码问题/#fn_1)
1.2 tar.xz 文件
tar.xz结尾的压缩文件,解决方法如下:
1 | $xz -d file.tar.xz # 会得到 file.tar 文件 |
这个压缩包也是打包后再压缩,外面是xz压缩方式,里层是tar打包方式。
1.3 tar.gz(即.tgz)解压
1 | tar -zxvf File.tgz -C Your-Directory |
2. 文件名|乱码解决方案
2.1 unzip方案
1 | # 先试试 |
这么试的原因是,编码技术的演进方向为:GB2312 ⇒ GBK(=CP936) ⇒ GB18030,最新的一般能兼容旧的编码技术,遇到不兼容的情况再用旧的编码去尝试。如果无法使用 -O
参数,参考以下链接打补丁。
缺参数,则给unzip打补丁
参考 https://github.com/ikohara/dpkg-unzip-iconv ;按步骤给unzip打补丁,打完即可使用-O
参数了。
2.2 unar方案
如果是Debian,已经默认安装了unar,这个工具会自动检测文件的编码,也可以通过-e来指定:
1 | sudo apt-get install unar |
即可解压出中文文件。
1. 安装
1 | sudo apt-get install unar |
2.列出压缩包内容
1 | lsar test.zip |
3.解压压缩包
1 | unar test.zip |
4.unar常用选项解释
-o
解释:指定解压结果保存的位置
unar test.zip -o /home/dir/
-e
解释:指定编码
unar -e GBK test.zip
-p
解释:指定解压密码
unar -p 123456 test.zip
3.解决linux解压压缩包中文文件名乱码问题
1 | lsar test.zip |
2.3 7z和convmv结合方案
在ubuntu下的安装命令是
1 | sudo apt-get install p7zip-full convmv |
安装完之后,就可以用7z
和convmv
两个命令完成解压缩任务。
1 | LANG=C 7z x zip-file.zip |
第一条命令用于解压缩,而LANG=C表示以US-ASCII这样的编码输出文件名,如果没有这个语言设置,它同样会输出乱码,只不过是UTF8格式的乱码(convmv
会忽略这样的乱码)。
第二条命令是将GBK编码的文件名转化为UTF8编码,-r
表示递归访问目录,即对当前目录中所有文件进行转换。
convmv支持的部分参数如下:
-f
源编码-t
目标编码--notest
convmv默认只会显示文件名转换后的结果而不会实际进行转换。使用这个参数使convmv对文件名进行实际的编码转换。--list
列出convmv支持的所有编码-r
递归转换所有子目录的文件名编码
2.4 7z方案
1 | apt-get install p7zip-full |
7zip命令有7z和7za,7za是精简版部分格式不支持,7z是全功能版的,建议使用7z。
1 | 7z {a|d|l|e|u|x} 压缩包文件名 {文件列表或目录,可选} |
- a 向压缩包里添加文件或创建压缩包,如向deepvps.7z添加deepvps001.jpg,执行:7z a deepvps.7z deepvps001.jpg;将deepvps目录打包执行:7z a deepvps.7z deepvps;
- d 从压缩里删除文件,如将deepvps.7z里的test.jpg删除,执行:7z d deepvps.7z test.jpg
- l 列出压缩包里的文件,如列出deepvps.7z里的文件,执行:7z l deepvps.7z
- e 解压到当前目录,目录结构会被破坏,如deepvps.rar内有如下目录及文件123/456/789.html,执行:7z e deepvps.rar,目录123和456及文件789.html都会存放在当前目录下。
- x 以完整路径解压。
由于zip文件中没有声明其编码,所以在Linux上使用unzip解压以默认编码解压,中文文件名会出现乱码。
使用7z解压即可解决:7z x deepvps.zip
也可以使用:jar xvf deepvps.zip
3 文件内容|乱码解决方案
2.1 iconv工具
1 | iconv -f gbk -t utf-8 file1 -o file2 # gbk编码转换为utf-8 |
命令很简单,可以man出手册或者--help
看一下。
2.2 enca工具
1 | # -L指明文件语言,一般可以省略 |
说说遇到的坑:非得让我指定语言,不指定还不行,说可以用 -L none
,然而根本识别不了。然后又试了 zh_CN,一样不行。用 enca --list language
查看所支持的语言列表,然而写那么多一堆,居然没有English,逗我?!而且,这列表里的项不能直接当作 -L
的参数,不知道参数去哪里查!然后就懒得继续查了,毕竟问题已解决。
2.3 查看文件编码
2.3.1 用vim查看
用vim打开文件,输入:
1 | :set fileencoding |
回车便可看到编码,但是不一定可信!
我的一个本地文件 besttrace4linux.txt ,明明是GB18030编码,但用vim查询显示是latin1编码,搞死我了!
用iconv
试着把该文件从latin1, ascii 转成 utf-8, iso88592, gb2312 各种错!最后试着转到 GB18030,发现居然能转过去,只是转过去后仍然是乱码。此时我灵机一动,该不会原本就是这个编码吧?然后回到我的zsh,发现果然在zsh打印的信息里显示了正确的中文!我屮艸芔茻,花了一个小时终于见到曙光了。这时候,一句:
1 | iconv -f gb18030 -t utf-8 besttrace4linux.txt -o readme.txt |
哇!世界从未如此美好,成功!至此,知道用vim查看编码是会骗人的!!!
...
...
Copyright 2021 sunfy.top ALL Rights Reserved