上次我们聊了ZIP、RAR、7z的区别:
.zip、.rar、.7z 到底有什么区别?压缩包的原理是什么?
有位读者在评论区问了一个特别好的问题:
“为什么Windows压缩的zip文件名到Linux就变乱码?而rar却不会?”
你有没有过这样的经历:在Windows上辛辛苦苦整理了一堆中文名的文件,打包成zip,发给了用Linux的小伙伴。结果对方一解压,满屏的“绋肩�名.zip”之类的乱码,瞬间血压飙升。而换成rar格式,居然就一切正常?
这到底是玄学还是技术问题?今天我们就来把这个“跨平台乱码”的谜底彻底揭开。
简单来说,Zip和Rar在存储文件名时,用了不同的“语言”(编码)。
当你的Linux小伙伴用他的“普通话”(UTF-8)去读Zip里的“方言”时,自然就听天书(乱码)了。而Rar因为存的是世界语,谁都能看懂。
我们可以把压缩包想象成一套房子,文件名就是开门的钥匙。
Zip格式诞生于1989年,那时候互联网还没普及,更没人想到会有“跨平台”这回事。Zip的设计规范里,压根就没规定文件名应该用什么编码。所以压缩软件在打包时,就顺手用了操作系统当前的默认编码。
GBK和UTF-8对同一个汉字的表示方式完全不同。当解压工具(比如Linux的unzip)看到一堆字节时,它并不知道这是GBK编码的,只能傻傻地按UTF-8去解读。结果就是:本应是一个汉字,却被拆成了几个奇怪的符号,乱码就这么产生了。
Rar格式诞生于1993年,比Zip晚了几年。它的设计者显然吸取了教训,在格式规范中明确支持 Unicode。
当你在Windows上用WinRAR压缩中文文件时,Rar会自动把文件名“翻译”成Unicode(一种全球统一的字符集)存储到压缩包里。无论在哪个操作系统上解压,只要解压软件支持Unicode(现在基本上都支持),它就能准确地把Unicode还原回原来的中文文件名。这就彻底解决了“语言不通”的问题。
如果不幸收到了一个乱码的Zip包,别急着摔键盘,试试这些工具:
unar 命令,它能自动检测编码并正确解压。ounter(lineounter(linesudo apt install unar # Debian/Ubuntuunar 乱码文件.zip
Windows:用7-Zip或Bandizip打开,它们一般都能自动识别GBK编码,不乱码。
用unzip -O指定编码(Linux,知道是哪一个编码):
ounter(lineunzip -O GBK 乱码文件.zip
如果知道压缩时用的是GBK,强制用GBK解压即可。
convmv 工具批量转换文件名编码。乱码问题的本质,是Zip格式诞生太早,没跟上全球化的步伐,留下了一个“编码未指定”的坑。而Rar作为后来者,直接采用了Unicode,完美避开了这个坑。
现在,当你下次给Linux小伙伴发文件时,可以自豪地说:“别用zip了,用rar或者7z吧,保证不乱码!”如果对方反问为什么,你就可以把这篇文章甩给他——不仅解决了问题,还涨了姿势。