• 首页
  • 指南
  • Mac 创建的 ZIP 在 Windows 上文件名乱码的原因(3 种解决方法)

Mac 创建的 ZIP 在 Windows 上文件名乱码的原因(3 种解决方法)

@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 规范化)就能避免这个问题。

系统自带工具创建的 ZIP 是什么样的

我们在 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 文件夹。其中存放的是名称以 ._ 开头的文件。

推荐方法 1:用应用压缩(ZipScope)

ZipScope 是本指南作者开发的一款用于解压和压缩的 Mac 应用,能创建 Windows 用户打开后文件名不会乱码的 ZIP。 它会为非 ASCII 文件名设置 UTF-8 标志,并统一规范化为 NFC。默认排除 .DS_Store、__MACOSX 和 ._ 文件。

1

右键压缩

在访达中选中文件或文件夹,点按右键,然后选择“Compress with ZipScope”。也可以把它们拖放到菜单栏图标上。

2

检查设置

排除 .DS_Store 和 NFC 规范化默认就是打开的。请确认文件名和存储位置。

3

点按“Create”

创建完成的 ZIP 会在访达中显示,在 Windows 上文件名也能保持正常。

ZipScope 的 ZIP 创建窗口,面向 Windows 的选项默认处于打开状态

创建不带密码的 ZIP 是免费的。创建带密码的 ZIP 和 7z 压缩文件属于 Pro 功能(App 内购买,买断制)。 ZipScope 从不使用网络,你的文件不会离开你的 Mac。

查看 ZipScope →

macOS 14 或更高版本 · Apple 芯片和 Intel

适合终端用户方法 2:用 Python 的 zipfile 压缩

Python 内置的 zipfile 模块会为非 ASCII 文件名设置 UTF-8 标志。在“终端”中进入要压缩的内容所在的文件夹,然后运行:

cd ~/Desktop
python3 -m zipfile -c Documents.zip Documents/

第一次运行 python3 时,macOS 可能会要求你安装命令行开发者工具。 这种方法有几个限制:

  • 会包含 .DS_Store 文件(没有排除它们的选项)。
  • 不会把文件名规范化为 NFC,所以分解形式(NFD)的文件名会原样放进去。
  • 每次都需要打开“终端”。

如果不想包含 .DS_Store,请先从源文件夹中删除它(这只会重置访达对该文件夹的显示设置)。

find Documents -name .DS_Store -delete

无需安装方法 3:先把文件名改成 ASCII

如果所有文件和文件夹的名称都只使用纯 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

.DS_Store 是访达保存文件夹显示设置的地方。__MACOSX 是访达的“压缩”为了保留扩展属性而创建的文件夹。 两者在 Mac 上都是隐藏的,但在 Windows 上会显示为普通文件,所以对方才会询问这些奇怪的多余文件是什么。

  • 访达的“压缩” ─ 没有排除它们的设置。
  • zip 命令 ─ 用 -x "*.DS_Store" 排除 .DS_Store。不会创建 __MACOSX 文件夹。
  • ZipScope ─ 默认排除 .DS_Store、__MACOSX 和 ._ 文件。解压在 Mac 上创建的 ZIP 时也会跳过它们(可在设置中更改)。

来自 Windows 的 ZIP 在 Mac 上显示乱码时

反过来也会出现同样的问题。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。

以错误编码读取、文件名显示为乱码的文件列表
经 ZipScope 自动识别后,以正确日文显示的同一文件列表

哪种方法适合你

  • 工作中要与 Windows 用户互传 ZIP ─ ZipScope。只需点按右键,就能得到没有乱码、不含 .DS_Store 的 ZIP,还能处理来自 Windows 的乱码 ZIP。
  • 偶尔发送 ZIP,而且不介意使用“终端” ─ Python 的 zipfile。请先删除 .DS_Store。
  • 文件不多,重命名也无妨 ─ 改成 ASCII 文件名。

常见问题

Q. ZIP 文件中的 UTF-8 标志是什么?

它是每个文件头中的一个标记,表示“这个文件名是用 UTF-8 写的”。ZIP 规范中称之为通用标志位(general purpose flag)的第 11 位,也叫语言编码标志(Language encoding flag,EFS)。 设置了这个标志时,Windows 会按 UTF-8 读取文件名;没有设置时,Windows 会按其旧式代码页读取文件名(美国英语版 Windows 为 CP437,日文版 Windows 为 Shift_JIS),于是来自 Mac 的文件名就会变成乱码。

Q. 我发送的是在 Windows 上不会乱码的 ZIP,但对方看到的文件名还是乱码。

对方可能在使用一款会忽略 UTF-8 标志的旧版解压工具。较新版本的 Windows 用自带工具(文件资源管理器)就能正确读取设置了 UTF-8 标志的 ZIP,所以请让对方用自带工具打开,或者把文件名改成纯 ASCII 后重新压缩。

Q. 对方能在 Windows 上修复乱码的文件名吗?

如果使用能按 UTF-8 重新读取文件名的解压工具,也许能正确显示。不过,在你这边创建设置了 UTF-8 标志的 ZIP 更可靠,也能省去对方的麻烦。

Q. 删除 .DS_Store 文件安全吗?

.DS_Store 是访达保存文件夹显示设置(图标位置、显示方式等)的地方。删除它不会影响你的文档,访达会在需要时重新创建。 如果只是不想把它放进 ZIP,并不需要删除它;请参阅排除 .DS_Store 和 __MACOSX。

Q. 带密码的 ZIP 也能让文件名在 Windows 上不乱码吗?

可以。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,也能免得对方感到困惑。