防止 7-Zip 生成的 ZIP 文件在 Mac OS X 下出现乱码

简介:

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

一直以来,我发现在 Mac OS X 中,不论用 Stuffit Expander 还是命令行下的 unzip,解压缩 Windows 下生成的某些 ZIP 文件时,解出来的中文文件名会变成乱码。不过,这种情况出现的次数很少,没有引起我的重视。今天终于觉得不能忍了,以几个简单关键词在 Google 上搜索,好像没有发现专门说这件事情的。于是决心花点时间研究它。

我在 Windows 下的 ZIP 文件大多数是用 7-Zip 这个自由软件生成的。虽然它的强项在于自己的 7z 格式,不过出于兼容性的考虑,我只是用它压缩 ZIP 格式文件,并解压缩所有常见的压缩文件格式。ZIP 文件标准自创立之初就没有、现在也没有记录文件名编码的信息,所以有很大一批 ZIP 文件都是以压缩包的创建者本地 locale 编码的,比如我遇到问题的几个 ZIP 文件内部的文件名就是用简体中文 GBK 编码的。而我 Mac OS X 的 locale 是 en_US.UTF-8,解开后自然不能正确识别 GBK 编码的文件名了。

阅读了 ZIP 文件格式这个 Wikipedia 条目,我发现最新的 ZIP 标准中建议使用 UTF-8 作为文件名的编码。这一点并不出乎意料,显然对于跨平台的需求,UTF-8 的编码是最理想的选择。下面的问题就是如何让 7-Zip 生成以 UTF-8 编码被压缩文件名的 ZIP 文件了。

在 Windows 下进行试验,我发现一个有意思的现象:当 Windows 系统的 locale 为简体中文(中国)时(“控制面板-区域和语言选项-高级-为非Unicode程序的语言选择 - Chinese (PRC)”),7-Zip 压缩出来的 ZIP 文件以 GBK 编码被压缩文件名;而当 Windows 系统的 locale 为英语(美国)时,压缩出来的 ZIP 文件编码竟然是 UTF-8!此外,在中文 locale 下,不论是以 GBK 还是 UTF-8 编码文件名的 ZIP 文件都能正常解开;而在英文 locale 下,只能解开 UTF-8 编码的文件,GBK 编码的文件解出来就是乱码。这表明, 7-Zip 是有处理 UTF-8 编码文件名的功能的。但是,为什么仅仅对英语(美国)代码页(也就是最基本的 ASCII )才会使用 UTF-8 呢?

继续查找,发现 UTF-8 的版本历史里面,自从 4.58 版本以来引入了 ZIP 内部文件名编码的概念。默认模式是,对于生成 ZIP 文件的文件名,如果当前 locale 代码页中有相应字符,就用当前代码页;如果没有,就使用 UTF-8。同时,7-Zip 也提供了两个模式,强制以 UTF-8 编码文件名,或强制以当前 locale 编码文件名(即不作转换)。

了解了这一点,解决方法就变得简单了:压缩 ZIP 文件时,使用 -mcu 选项强制使用 UTF-8 作为压缩文件名的编码。图形界面中的操作如下:

7-Zip Add to archive parameter

需要注意的是,7-Zip 的 Explorer shell 右键菜单中“Add to .zip” 这个项目只能以默认参数生成 ZIP 文件。如果希望生成在其他平台不出现乱码的 UTF-8 编码 ZIP 文件,就只能使用 “Add to archive…” 菜单项了。










本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1386060,如需转载请自行联系原作者
目录
相关文章
|
5天前
|
Python
在Python中,利用`os模块`的`path.exists()`函数可判断文件是否存
【5月更文挑战第12天】在Python中,利用`os模块`的`path.exists()`函数可判断文件是否存在,该函数对路径进行检查,存在则返回True,不存在则返回False。示例代码展示了如何检查'example.txt'文件是否存在并相应打印消息。此外,`os.path.isfile()`用于确认路径是否为文件,仅当是文件时返回True,否则返回False,同样配以示例说明其用法。
23 2
|
5天前
|
Ubuntu Linux iOS开发
LabVIEW在不同操作系统上使VI、可执行文件或安装程序
LabVIEW在不同操作系统上使VI、可执行文件或安装程序
13 3
|
5天前
|
Linux Shell
Linux操作系统下查找大文件或目录的技巧
Linux操作系统下查找大文件或目录的技巧
12 2
|
5天前
|
Unix Shell Linux
史上最全:MAC OS X 命令行汇总
史上最全:MAC OS X 命令行汇总
13 0
|
5天前
|
安全 Java iOS开发
MAC OS X 硬盘安装详细分解教程
MAC OS X 硬盘安装详细分解教程
15 1
|
5天前
|
IDE 5G 开发工具
HP4230s笔记本安装mac os总结(原创)
HP4230s笔记本安装mac os总结(原创)
10 0
|
5天前
|
编解码 Oracle iOS开发
VirtualBox虚拟机安装Mac OS X Lion系统详解
VirtualBox虚拟机安装Mac OS X Lion系统详解
18 1
|
5天前
|
Go API 开发者
Golang深入浅出之-文件与目录操作:os与path/filepath包
【4月更文挑战第26天】Go语言标准库`os`和`path/filepath`提供文件读写、目录操作等功能。本文涵盖`os.Open`, `os.Create`, `os.Mkdir`, `filepath.Join`等API的使用,强调了文件关闭、路径处理、并发写入和权限问题的处理,并给出实战代码示例,帮助开发者高效、安全地操作文件与目录。注意使用`defer`关闭文件,`filepath`处理路径分隔符,以及通过同步机制解决并发写入冲突。
27 2
|
5天前
|
数据安全/隐私保护 索引 Python
「Python系列」Python OS文件/目录方法、Python错误和异常
Python的`os`模块提供了与操作系统交互的方法,包括文件和目录的操作。
19 1
|
5天前
|
Python
Python中的`os`和`sys`模块:深入解析文件和系统操作
Python是一种强大且易用的编程语言,其内置的`os`和`sys`模块提供了丰富的文件和系统操作功能。这些模块允许Python程序与操作系统进行交互,执行各种任务,如读取和写入文件、获取系统信息、管理目录和文件路径等。
http://www.vxiaotou.com