15

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

 4 years ago
source link: https://blog.miniasp.com/post/2020/09/14/7-Zip-with-Chinese-filenames-should-use-UTF-8
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
choose_the_right_partner3.png

昨天在授課的時候,由於課堂上提供給學員的壓縮檔案中目錄名稱檔案名稱有中文字的關係,導致全班有 3 位學員解壓縮之後這些目錄與檔案全部呈現亂碼,無法開啟與閱讀。經過一番研究之後發現,原來 7-Zip 在壓縮檔案的時候,預設會將檔名編碼為本機電腦系統設定的 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

    你從 Wikipedia 上面的 Code page 文件,就可以得知不同 Code Page 代表的文字編碼。若以台灣為例,我們常用的 Code page 為 950,也就是使用 Big5 編碼的意思。

  2. 使用 PowerShell 查詢出系統的區域設定

    Get-WinSystemLocale
    
    Get-WinSystemLocale

    這裡的 LCID (Locale ID) 1028 就代表著 zh-TW (Chinese Taiwan) 的意思,而 Chinese Taiwan 地區針對 non-Unicode 的應用程式,預設就是採取 Big5 作為編碼。

    以下是取得系統所有地區資訊的 Cmdlet 命令:

    Get-Culture
    Get-WinSystemLocale
    Get-WinUILanguageOverride
    Get-WinUserLanguageList
    Get-WinHomeLocation
    
  3. 使用「控制台」的「地區」設定

    你可以透過以下命令快速開啟控制台的「地區」設定視窗:

    control intl.cpl
    
    「控制台」的「地區」設定 (Region)

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

這邊有兩種設定方法:

  1. 透過 PowerShell 進行系統的區域設定

    請用「系統管理原身份」執行 PowerShell 視窗,並執行以下 Set-WinSystemLocale 命令:

    Set-WinSystemLocale -SystemLocale zh-TW
    

    注意:透過 PowerShell 設定需要讓電腦重開機兩次才會看到設定生效!(很詭異,但就是如此)

  2. 透過「控制台」的「地區」視窗進行設定

    你可以透過以下命令快速開啟控制台的「地區」設定視窗:

    control intl.cpl
    

    然後參考下圖手動進行設定即可:

    「控制台」的「地區」設定 (Region)

    變更後記得要重開機才會生效,但是只要重開機一次即可!

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

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

最後終於找到關於 7-Zip 命令列的參數說明文件,有個 -m (Set compression Method) switch 可以用來設定一些壓縮時的參數。這裡有個參數叫做 cu 可以設定用 7-Zip 壓縮檔案時是否要用 UTF-8 來對「檔名」進行編碼,而預設值竟然為 off (關閉)!

cu=on - 7-Zip uses UTF-8 for file names that contain non-ASCII symbols.

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

透過 7-Zip 加入壓縮檔

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

7z a -mcu=on test.zip

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


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK