zip压缩包中的文件名编码跟随系统设定,但zip文件中不会记录文件名编码,在windows中打包zip,放到linux中解压时,解压程序并不会自动转换文件名编码,因此会出现文件名乱码。解决这个问题的方法是让解压程序保留原始文件名,解压完毕后再转换编码。
我使用7z作为解压程序,因为7z对超过2GB的压缩包有很好的支持,而tar、unzip等都不支持超过2GB的文件。安装7z:
$ sudo apt-get install p7zip-full
然后设置系统编码:
$ export LANG=C
解压zip文件:
$ 7za x /path/to/zip
解压之后在gui文件管理器中可能会看到文件名后面出现(invalid encoding)的后缀,不用管它,使用ls命令看到的文件名是没有那个后缀的。
然后使用convmv转换编码。安装convmv:
$ sudo apt-get install convmv
convmv支持的部分参数如下:
-f 源编码
-f 目标编码
--notest convmv默认只会显示文件名转换后的结果而不会实际进行转换。使用这个参数使convmv对文件名进行实际的编码转换。
--list 列出convmv支持的所有编码
-r 递归转换所有子目录的文件名编码
转换:
$ convmv -f cp936 -t utf8 --notest /path/to/file
cp936是gbk编码在windows里的别称。