﻿# 透過 7-Zip 壓縮 ZIP 檔案時須注意中文檔名無法正確解壓縮的問題

昨天在授課的時候，由於課堂上提供給學員的壓縮檔案中**目錄名稱**與**檔案名稱**有中文字的關係，導致全班有 3 位學員解壓縮之後這些目錄與檔案全部呈現亂碼，無法開啟與閱讀。經過一番研究之後發現，原來 7-Zip 在壓縮檔案的時候，預設會將檔名編碼為本機電腦系統設定的 [Code Page](https://en.wikipedia.org/wiki/Code_page)，而不是使用 UTF-8 編碼，這會導致解壓縮的人只要不是用相同的 Code Page 設定，就會解壓縮失敗，檔名出現亂碼。本篇文章就來說說這個問題的始末與解決方案！

### 如何得知目前電腦使用的 Code Page

要查詢目前電腦使用的 Code Page 有三種方法：

1.  使用 Windows 內建的 `C:\Windows\System32\chcp.com` 工具
    
    這工具可以讓你查詢或切換到不同的 Code Page 設定，你可以先進入 Command Prompt 命令提示字元視窗，輸入 `chcp` 就可以知道目前系統預設的 Code Page 為何：
    
    ![chcp](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/a6379baf1d6c363d9a78-93038634-1a8a4880-f678-11ea-85cb-74d18bfdaf88.jpg)
    
    你從 Wikipedia 上面的 [Code page](https://en.wikipedia.org/wiki/Code_page) 文件，就可以得知不同 Code Page 代表的文字編碼。若以台灣為例，我們常用的 Code page 為 `950`，也就是使用 [Big5](https://en.wikipedia.org/wiki/Big5) 編碼的意思。
    
2.  使用 PowerShell 查詢出系統的區域設定
    
    ```powershell
    Get-WinSystemLocale
    ```
    
    ![Get-WinSystemLocale](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/d07e6c1c668f5530f0ef-93056486-0f96de80-f69f-11ea-95e0-c28e26aac253.png)
    
    這裡的 LCID ([Locale ID](https://learn.microsoft.com/en-us/previous-versions/windows/embedded/ms912047\(v=winembedded.10\))) `1028` 就代表著 `zh-TW` (Chinese Taiwan) 的意思，而 Chinese Taiwan 地區針對 non-Unicode 的應用程式，預設就是採取 `Big5` 作為編碼。
    
    以下是取得系統所有地區資訊的 Cmdlet 命令：
    
    ```powershell
    Get-Culture
    Get-WinSystemLocale
    Get-WinUILanguageOverride
    Get-WinUserLanguageList
    Get-WinHomeLocation
    ```
    
3.  使用「控制台」的「地區」設定
    
    你可以透過以下命令快速開啟控制台的「地區」設定視窗：
    
    ```powershell
    control intl.cpl
    ```
    
    ![「控制台」的「地區」設定 (Region)](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/aaf5e9da889dd59b8eb1-93058681-491d1900-f6a2-11ea-8c77-be98d43e6a68.png)
    

### 如何切換 Windows 10 系統預設編碼

這邊有兩種設定方法：

1.  透過 PowerShell 進行系統的區域設定
    
    請用「系統管理原身份」執行 PowerShell 視窗，並執行以下 [Set-WinSystemLocale](https://learn.microsoft.com/en-us/powershell/module/international/set-winsystemlocale?view=win10-ps) 命令：
    
    ```powershell
    Set-WinSystemLocale -SystemLocale zh-TW
    ```
    
    注意：透過 PowerShell 設定需要讓電腦**重開機兩次**才會看到設定生效！（很詭異，但就是如此）
    
2.  透過「控制台」的「地區」視窗進行設定
    
    你可以透過以下命令快速開啟控制台的「地區」設定視窗：
    
    ```powershell
    control intl.cpl
    ```
    
    然後參考下圖手動進行設定即可：
    
    ![「控制台」的「地區」設定 (Region)](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/312f49adae29433864fa-93058102-7a491980-f6a1-11ea-8e75-7998b68d4394.png)
    
    變更後記得要重開機才會生效，但是只要**重開機一次**即可！
    

### 如何設定 7-Zip 指定用 UTF-8 作為檔案名稱的預設編碼

其實這次出問題的同學來自馬來西亞(Malaysia)，他的電腦安裝全英文的 Windows 10 作業系統，而且地區資訊也不是設定在 Chinese Taiwan，所以才會遇到這次問題。但我總不能請他調整地區資訊吧？！我真正覺得納悶的地方是，Windows 10 老早就支援 Unicode 了，怎麼可能不能顯示中文檔名？會不會是 7-zip 壓縮軟體的問題？還是解壓縮軟體的問題呢？經過詢問發現，他也是用 7-Zip 進行解壓縮的，這就讓我更確信這問題來自於「壓縮」的過程，覺得一定有參數可以設定。

最後終於找到關於 7-Zip 命令列的參數說明文件，有個 [\-m (Set compression Method) switch](https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm) 可以用來設定一些壓縮時的參數。這裡有個參數叫做 `cu` 可以設定用 7-Zip 壓縮檔案時是否要用 UTF-8 來對「檔名」進行編碼，而預設值竟然為 `off` (關閉)！

![cu=on - 7-Zip uses UTF-8 for file names that contain non-ASCII symbols.](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/5760b81bff3d67da1b66-93060015-2429a580-f6a4-11ea-9521-1500197e23a0.png)

知道這個參數後，以後壓縮就知道了，你只要在壓縮的時候，參考以下圖示進行設定，先設定「壓縮檔格式」為 `zip`，然後在「參數」欄位加入 `cu=on` 即可完成設定。你成功壓縮一次之後，你這次所設定的 `cu=on` 參數會變成預設值，下次不用再手動設定！ 👍

![透過 7-Zip 加入壓縮檔](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/6a2092d1d41204475109-93061378-0b21f400-f6a6-11ea-8697-ff56c8852b7c.png)

如果你要用命令列工具壓縮，可以使用以下命令：

```bash
7z a -mcu=on test.zip
```

> 上述命令不特別指定要壓縮的檔名或目錄，預設會把「當前目錄」所有檔案與所有目錄全部壓縮成 `*.zip` 檔。

### 相關連結

-   [7-Zip](https://www.7-zip.org/)
-   [7-Zip - Wikipedia](https://en.wikipedia.org/wiki/7-Zip)
-   C# (.net) interface for 7-Zip archive dlls - Development Stuff
-   [在 Mac 電腦壓縮含有中文檔名的 ZIP 檔案如何正確在 Windows 下解壓縮](/post/2012/05/12/How-to-correct-unzip-Mac-format-ZIP-file-with-chinese-filename-in-Windows)
-   [開發者必學的多語言輸入法設定技巧：使用 Windows PowerShell 快速建立](/post/2020/03/19/Devs-must-setup-multi-language-input-method)
-   [Microsoft Locale ID Values | Microsoft Docs](https://learn.microsoft.com/en-us/previous-versions/windows/embedded/ms912047\(v=winembedded.10\))
-   [地區設定 - Wikipedia](https://zh.wikipedia.org/wiki/%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE)
-   [7-Zip Start Page](https://sevenzip.osdn.jp/chm/start.htm)
    -   [7-Zip - Command Line Switches](https://sevenzip.osdn.jp/chm/cmdline/switches/)
        -   [\-m (Set compression Method) switch](https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm)
