@SoNiceInfo 发布于 2026年10月13日
你在 Mac 上压缩了一个文件夹并发了出去,结果使用 Windows 的人看到的不是 Résumé.pdf,而是 R├⌐sum├⌐.pdf 这样的名字。 文件本身并没有问题,问题出在ZIP 如何标注文件名的文本编码上。 本指南根据我们用访达的“压缩”和 zip 命令实际创建的 ZIP,解释出现乱码的原因,并介绍在 Mac 上创建在 Windows 上也能保持文件名正常的 ZIP 的 3 种方法,以及如何排除 .DS_Store、__MACOSX 等 Mac 专用文件。
ZIP 格式并没有规定文件名必须使用哪种文本编码,而是在每个文件头中设有一个 UTF-8 标志:设置了这个标志,文件名就是 UTF-8。 没有这个标志时,接收方的系统会按自己的方式读取文件名。Windows 会按其旧式代码页读取没有标志的文件名:美国英语版 Windows 为 CP437,日文版 Windows 为 Shift_JIS(CP932)。
Mac 用 UTF-8 写入文件名,却不设置这个标志。于是 Windows 把 UTF-8 字节当作 CP437 或 Shift_JIS 解码,Résumé.pdf 变成了 R├⌐sum├⌐.pdf,而像 見積書.pdf 这样的日文文件名则变成一串毫不相干的字符。
还有一个与重音符号和日文浊音符号有关的问题。Mac 有时会把 é 这样的字符存储为两个字符,即 e 加上一个组合重音符号(这种形式称为 NFD)。如果原样放进 ZIP,Windows 上的某些工具会把重音符号单独显示出来。 把它们合并成一个字符(NFC 规范化)就能避免这个问题。
我们在 macOS 27 上压缩了一个包含日文文件名的文件和一个 .DS_Store 文件的文件夹,然后检查了生成的 ZIP。 访达的“压缩”用 ditto -c -k --sequesterRsrc --keepParent 来重现;根据 ditto 的 man 手册,该命令会创建与访达“压缩”类似的压缩文件。
| 方法 | UTF-8 标志 | .DS_Store | __MACOSX |
|---|---|---|---|
| 访达的“压缩” | 未设置 | 包含 | 包含(文件带有扩展属性时) |
zip 命令(zip -r) | 未设置(没有可设置的选项) | 包含(用 -x 排除) | 不包含 |
| Python 的 zipfile | 已设置 | 包含 | 不包含 |
| ZipScope | 已设置(并进行 NFC 规范化) | 不包含 | 不包含 |
macOS 自带的 zip 命令在编译时没有加入设置 UTF-8 标志的选项(-UN),使用该选项会报错。 也就是说,仅靠系统自带工具,无法创建在 Windows 上保持非 ASCII 文件名正常的 ZIP。
当文件带有扩展属性时(例如下载的文件,或在访达中添加了标签的文件),就会出现 __MACOSX 文件夹。其中存放的是名称以 ._ 开头的文件。
ZipScope 是本指南作者开发的一款用于解压和压缩的 Mac 应用,能创建 Windows 用户打开后文件名不会乱码的 ZIP。 它会为非 ASCII 文件名设置 UTF-8 标志,并统一规范化为 NFC。默认排除 .DS_Store、__MACOSX 和 ._ 文件。
右键压缩
在访达中选中文件或文件夹,点按右键,然后选择“Compress with ZipScope”。也可以把它们拖放到菜单栏图标上。
检查设置
排除 .DS_Store 和 NFC 规范化默认就是打开的。请确认文件名和存储位置。
点按“Create”
创建完成的 ZIP 会在访达中显示,在 Windows 上文件名也能保持正常。

创建不带密码的 ZIP 是免费的。创建带密码的 ZIP 和 7z 压缩文件属于 Pro 功能(App 内购买,买断制)。 ZipScope 从不使用网络,你的文件不会离开你的 Mac。
macOS 14 或更高版本 · Apple 芯片和 Intel
Python 内置的 zipfile 模块会为非 ASCII 文件名设置 UTF-8 标志。在“终端”中进入要压缩的内容所在的文件夹,然后运行:
cd ~/Desktop
python3 -m zipfile -c Documents.zip Documents/第一次运行 python3 时,macOS 可能会要求你安装命令行开发者工具。 这种方法有几个限制:
如果不想包含 .DS_Store,请先从源文件夹中删除它(这只会重置访达对该文件夹的显示设置)。
find Documents -name .DS_Store -delete如果所有文件和文件夹的名称都只使用纯 ASCII 字母和数字,那么用什么工具都可以,也完全不会出现编码问题。这种方法很可靠,但重命名大量文件很费时间,而且对方可能更难看懂文件名的含义。
访达的“压缩”仍然会加入 .DS_Store 和 __MACOSX,如果介意,请使用 zip 命令并排除 .DS_Store:
cd ~/Desktop
zip -r Documents.zip Documents -x "*.DS_Store"-x "*.DS_Store" 用于排除 .DS_Store 文件。zip 命令不会创建 __MACOSX 文件夹。
.DS_Store 是访达保存文件夹显示设置的地方。__MACOSX 是访达的“压缩”为了保留扩展属性而创建的文件夹。 两者在 Mac 上都是隐藏的,但在 Windows 上会显示为普通文件,所以对方才会询问这些奇怪的多余文件是什么。
-x "*.DS_Store" 排除 .DS_Store。不会创建 __MACOSX 文件夹。反过来也会出现同样的问题。Windows 用旧式代码页写入 ZIP 中的文件名,且不设置 UTF-8 标志,所以来自日文版 Windows 的 ZIP 会以 Shift_JIS 存储文件名。 我们在 macOS 27 上用系统自带工具(ditto)解压了这样的 ZIP。当 Mac 的语言设为日语时,文件名能正确显示;而系统编码为英语时,文件名变成了 å©êœèë,unzip 命令也因出错而停止。 因此,系统自带工具能否正确处理,取决于你的 Mac 使用的语言。
无论 Mac 使用哪种语言,ZipScope 都能自动识别 Shift_JIS(CP932)文件名,并以正确的日文显示。 如果识别有误,可以在 CP932、UTF-8、EUC-JP、GBK、EUC-KR 和 CP437 之间手动切换。对于使用日文密码的 ZIP,它会同时尝试 UTF-8 和 CP932。


它是每个文件头中的一个标记,表示“这个文件名是用 UTF-8 写的”。ZIP 规范中称之为通用标志位(general purpose flag)的第 11 位,也叫语言编码标志(Language encoding flag,EFS)。 设置了这个标志时,Windows 会按 UTF-8 读取文件名;没有设置时,Windows 会按其旧式代码页读取文件名(美国英语版 Windows 为 CP437,日文版 Windows 为 Shift_JIS),于是来自 Mac 的文件名就会变成乱码。
对方可能在使用一款会忽略 UTF-8 标志的旧版解压工具。较新版本的 Windows 用自带工具(文件资源管理器)就能正确读取设置了 UTF-8 标志的 ZIP,所以请让对方用自带工具打开,或者把文件名改成纯 ASCII 后重新压缩。
如果使用能按 UTF-8 重新读取文件名的解压工具,也许能正确显示。不过,在你这边创建设置了 UTF-8 标志的 ZIP 更可靠,也能省去对方的麻烦。
.DS_Store 是访达保存文件夹显示设置(图标位置、显示方式等)的地方。删除它不会影响你的文档,访达会在需要时重新创建。 如果只是不想把它放进 ZIP,并不需要删除它;请参阅排除 .DS_Store 和 __MACOSX。
可以。ZipScope Pro(买断制)创建的带密码 ZIP 会带有 UTF-8 标志,并且可以用 Windows 自带工具打开。 zip 命令可以设置密码,但无法设置 UTF-8 标志。请参阅如何在 Mac 上创建带密码的 ZIP。
在 Mac 上创建的 ZIP 在 Windows 上会乱码,是因为 Mac 用 UTF-8 写入文件名,却没有设置表明这一点的标志。 访达的“压缩”和 zip 命令都无法设置这个标志,所以要保持非 ASCII 文件名正常,请使用 ZipScope 这类能设置 UTF-8 标志的应用,或者 Python 的 zipfile。 排除 .DS_Store 和 __MACOSX,也能免得对方感到困惑。