由于默认编码环境不同,打包时正常的文件和目录,在解包时就是乱码了。就拿winrar来说,windows中文版下,默认的编码是GBK
你将一堆文件打包给mac用户或者linux用户,那边的默认编码是UTF8,解压出来文件内容没有毛病,但是文件名却是一堆乱码。
其实WinRAR是这样约定的:如果压缩文件包含 Unicode 文件名并且 WinRAR 能够可靠地检测到它,WinRAR 会忽略此菜单里"名称加密"当前设置,并使用 Unicode 名称。 当没有可用的 Unicode 名称时或无法确切地检测到编码时才使用 “名称加密” 的设置。也就是说,你传一个以utf8编码的包给他人,别人都能识别,但是你如果把自己winrar“名称加密”设置为utf8并"保存当前"的话,别人发给你utf8文件当然可以识别文件名,但是如果是gbk编码的,则识别为乱码了。所以windows下winrar最佳使用方式是打包时选择utf8格式,设置仍为默认的gbk格式。。。,可惜厂商还没有这样给实现。。。
我在node.js里用compressing处理zip包,就遇到有用户提供的包内是utf8编码,另一些用户是gbk编码。虽然知道一些检查zip内文件名编码的方案,但是一般不能确保有效,于是干脆给业务进行了一个约定,windows下打包的zip后缀名按.zip小写命名,就使用默认gbk编码,linux/mac下或者其他以utf8打包的zip以.ZIP大写命名,后台以zip的后缀大小写来区分编码格式,以此解包:
...
let tmpdir=file.substr(0,file.length-4);
let encodeset=(file.endsWith(".zip"))?"gbk":"utf8";
compressing.zip.uncompress(destPath+"/"+file, destPath+"/"+tmpdir,{zipFileNameEncoding:encodeset}).then(() => {
...
简单粗暴,业务同意即可。。。如果自己去深研压缩包文件编码格式搞个自动检测,判断失误了还挺麻烦的。。。