@SoNiceInfo 發布於 2026年10月13日
你在 Mac 上壓縮了一個資料夾並傳出去,結果使用 Windows 的對方看到的不是 Résumé.pdf,而是 R├⌐sum├⌐.pdf 這樣的檔名。 檔案本身並沒有問題,問題出在 ZIP 如何標示檔名的文字編碼。 本指南根據我們實際用 Finder 的「壓縮」與 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。 Finder 的「壓縮」是以 ditto -c -k --sequesterRsrc --keepParent 重現的;根據 ditto 的 man page,這個指令會建立與 Finder「壓縮」類似的壓縮檔。
| 方法 | UTF-8 旗標 | .DS_Store | __MACOSX |
|---|---|---|---|
| Finder 的「壓縮」 | 未設定 | 包含 | 包含(檔案帶有延伸屬性時) |
zip 指令(zip -r) | 未設定(沒有可設定的選項) | 包含(可用 -x 排除) | 不包含 |
| Python 的 zipfile | 已設定 | 包含 | 不包含 |
| ZipScope | 已設定(並進行 NFC 正規化) | 不包含 | 不包含 |
macOS 內建的 zip 指令在編譯時並未納入設定 UTF-8 旗標的選項(-UN),使用這個選項會出現錯誤。 換句話說,光靠內建工具,無法建立能在 Windows 上保留正確非 ASCII 檔名的 ZIP。
__MACOSX 資料夾會在檔案帶有延伸屬性時出現,例如從網路下載的檔案,或在 Finder 中加上標籤的檔案。資料夾中存放的是檔名以 ._ 開頭的檔案。
ZipScope 是本指南作者開發的 Mac 解壓縮與壓縮 App,能建立 Windows 使用者開啟後檔名不會變成亂碼的 ZIP。 它會為非 ASCII 的檔名設定 UTF-8 旗標,並正規化為 NFC。.DS_Store、__MACOSX 與 ._ 檔案預設都會被排除。
按右鍵壓縮
在 Finder 中選取檔案或資料夾,按右鍵並選擇「Compress with ZipScope」。也可以把它們拖放到選單列圖示上。
確認設定
排除 .DS_Store 與 NFC 正規化一開始就已開啟。請確認檔名與儲存位置。
按一下「Create」
就會得到在 Windows 上也能保留正確檔名的 ZIP,並在 Finder 中顯示。

建立沒有密碼的 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,請先從來源資料夾中刪除它(這只會重設 Finder 對該資料夾的顯示設定)。
find Documents -name .DS_Store -delete如果所有檔案與資料夾的名稱都只使用純 ASCII 的英文字母與數字,用任何工具都可以,完全不會有編碼的問題。這個方法很可靠,但要重新命名大量檔案很花時間,而且對方可能比較看不懂檔名的意思。
Finder 的「壓縮」仍然會加入 .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 是 Finder 儲存資料夾顯示設定的檔案。__MACOSX 則是 Finder 的「壓縮」為了保留延伸屬性而建立的資料夾。 兩者在 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 是 Finder 用來儲存資料夾顯示設定(圖示位置、顯示方式等)的檔案。刪除它不會影響你的文件,Finder 也會在需要時重新建立。 只是不想讓它被包進 ZIP 的話,其實不必刪除;請參閱排除 .DS_Store 與 __MACOSX。
可以。ZipScope Pro(一次買斷)建立的有密碼保護的 ZIP 會帶有 UTF-8 旗標,並能用 Windows 內建工具開啟。 zip 指令雖然可以加上密碼,但無法設定 UTF-8 旗標。請參閱如何在 Mac 上建立有密碼保護的 ZIP。
在 Mac 上建立的 ZIP 之所以在 Windows 上變成亂碼,是因為 Mac 以 UTF-8 寫入檔名,卻沒有設定標示這件事的旗標。 Finder 的「壓縮」與 zip 指令都無法設定這個旗標,因此想保留非 ASCII 的檔名,請使用 ZipScope 等會設定 UTF-8 旗標的 App,或是 Python 的 zipfile。 排除 .DS_Store 與 __MACOSX,也能讓對方少一些困惑。