:::

用7-Zip解壓縮含有亂碼檔名的ZIP檔案 / Using 7-Zip to decompress ZIP with given encoding

3月 30, 2021 30 Comments Edit Copy Download

24-7_Zip_ZIP_Using_7_Zip_to_decompress.jpg

啊囉哈~這裡是不管天氣冷熱都要跟蚊子生死鬥的布丁。今天要來跟大家聊聊壓縮檔的檔名問題。

華人世界比較常用的壓縮檔格式為RAR,不過我個人則是推崇泛用的傳統壓縮檔格式ZIP以及壓縮率更好的7-Zip。在正式典藏資料的網站中,ZIP也是許多網站的首選。不過,有時候在為ZIP壓縮檔解壓縮時, 不是發現裡面沒有檔案,就是檔名變成亂碼或底線。 為什麼會變成這樣呢?

調查之後才發現,ZIP壓縮檔的檔名出現亂碼時,通常是因為我們現在在用的作業系統跟壓縮者當下的作業系統並不相同的緣故。因此當我使用大五碼的作業系統處理來自日文編碼的ZIP壓縮檔時,解壓縮後的檔案名稱就或變成亂碼。

那如果我想要解壓縮來自日文編碼的ZIP壓縮檔,又想要維持檔名不要變成亂碼的話,該怎麼做好呢?這篇我會說明如何使用7-Zip的參數「cp」來設定解壓縮時使用的編碼。這樣就能正確將檔案解壓縮、並且避免亂碼出現囉。接下來就讓我們來看看要怎麼做吧。



ZIP壓縮檔中的檔名亂碼 / When a character encoding in the ZIP file is incorrect

2021-0329-232334.png

首先我們來個含有亂碼的ZIP檔案吧。我從已經結束的卡牌遊戲水瓶戰記裡下載了一個卡牌列表。檔案下載連結如下:

2021-0329-231905.png

我的環境是Windows 7 64位元。利用7-Zip 19.00版本把ex_style.zip解壓縮後,我們可以得到一個檔案「____.xls」。顯然的,檔案名稱已經變成亂碼了。

會出現這個問題,是因為ZIP壓縮檔的製作者採用的編碼,跟我現在使用的這臺電腦所採用的編碼並不相同。我們可能會以為Windows都已經採用了Unicode萬國碼,但實際上製作ZIP檔案時,可能會受到製作軟體與設定的影響,而未必會真的以Unicode壓縮。

Kuan-Yi Li在「對抗 ZIP 亂碼檔名大作戰」一文中,針對Windows、OS X和Linux採用不同工具進行壓縮,比較同語系檔名和異語系檔名之間有沒有出現亂碼的情況。但實驗的內容有點讓人看不太懂,最後的結論是不建議使用ZIP格式。

但如果你現在手上就是有一個ZIP壓縮檔,而你要讓它解壓縮的時候不要出現亂碼的話,那得怎麼辦好呢?

解決方法 / Solutions

根據Kuan-Yi Li的建議,在不同平臺上皆有對應的工具,可以幫助你處理ZIP檔案亂碼的問題:

除此之外,也有人建議使用pAppLocale將軟體設定為特定語系,這樣就能正常處理該語系的檔案。關於pAppLocale可以看阿榮福利味的「pAppLocale - 讓簡體中文軟體可以正常顯示」。愛分享的「解壓縮日文RAR檔的三種方法(劣+正常+快速) 日文檔亂碼」提供了pAppLocale搭配7-Zip的解壓縮方法,不過處理手續有點複雜。

2021-03-30_013908.png

(圖片來源:7-zip日文說明網頁中的壓縮參數說明)

如果你的電腦本來就有7-Zip,那最簡單的方法,還是使用7-Zip內建的「cp」參數來指定解壓縮時使用的字元編碼,就可以使用跟壓縮者一樣的編碼來解壓縮,檔案名稱也就不會出現亂碼了。

不過,說明裡面提到了「cp={CodePage}」。這個Code Page是指什麼呢?

ZIP的代碼頁 / Code page in ZIP

2021-03-29_234820.png

(圖片來源:ZIP File Format Specification)

ZIP檔案格式規格書中記載了ZIP語言編碼的細節。首先該文件指出「當檔名和註解欄位都是UTF-8的時候,新的多用途位元標誌(General Purpose Bit Flat),也就是位於bit 11的語言編碼標誌(Language encoding flag, EFS)可以用來表示該檔名和註解都使用了UTF-8。」後面附錄D的D.2又提到,「如果bit 11沒有設定,則檔名和註解應該符合原始的ZIP字元編碼」。

這邊指的字元編碼(character encoding)是使用IBM代碼頁(Code Page)的規則。這跟網頁中用<meta>標籤指定網頁語系Character Sets的方式不太相同,IBM代碼頁是用數字表示字元編碼。我們常見的代碼頁如下:

  • 繁體中文 (Big5,大五碼):950
  • 簡體中文 (GBK):936
  • 簡體中文 (GB18030):54936
  • 日文 (Shift_JIS):932
  • 韓文 (EUC-KR):949

其他的IBM代碼頁(Code Page)可以參考維基百科中的DOS code pages

ex_style.zip的例子中,我們可以得知該ZIP壓縮檔來自日本,表示對方可能使用的是日文編碼,對應的代碼頁為932。接下來我們就可以用7-Zip搭配cp參數來解壓縮囉。


用7-Zip解壓縮含有日文檔名的ZIP檔 / Decompress ZIP with Japanese character encoding (code page) via 7-Zip

我本來是打算使用7-Zip圖形化介面來操作,研究了一下赫然發現7-Zip圖形化界面中只有在壓縮的時候才能用參數,但解壓縮的時候卻不行。因此以下操作是在指令列中進行。

操作環境與7-Zip檔案下載 / Environment and 7-Zip download

2021-0330-020358.png

(圖片來源:7-Zip下載)

首先我們要取得7-Zip的指令列版本。我的作業系統是Windows 7 64位元,在下載頁面中可以找到僅有指令列版本的「7-Zip 附加程式:命令行介面版本、7z DLL 及 FAR Manager 外掛程式」。下載連結如下:

將7-Zip指令列工具解壓縮到一個資料夾後,我們就可以來解壓縮含有日文檔名的資料夾了。

用指令列解壓縮 / Depression the ZIP file on the command line

2021-03-30_021009.png

我們把前面含有日文檔案名稱的壓縮檔擺到7-Zip同一個目錄底下。

接著請開啟命令提示字元,輸入指令移動到7-Zip目錄底下。如果你不會用cd指令操作指令列的話,可以參考讀樂島的「DOS指令/命令提示字元 簡易使用教學」。

2021-0330-022226.png

在確保該目錄底下有7-Zip執行檔「7za.exe」跟要解壓縮的ZIP檔案「ex_style.zip」之後,請輸入以下指令:


            dos
            
        7za.exe x ex_style.zip -mcp=932

這串指令中有兩個參數需要注意,我各別用紅字跟藍字標示:

  • ex_style.zip:表示要解壓縮的壓縮檔。
  • 932:表示代碼頁。932為日文(Shift_JIS)的代碼頁。

2021-0330-023242.png

成功執行解壓縮之後,該目錄底下就會出現一個新的檔案。檔案名稱為「エキストラスタイル対応カードリスト.xls」,這就是原本解壓縮會出現亂碼檔案的正常檔名。

到這裡為止,我們就算是大功告成了。


布丁客製化的檔案壓縮工具:AutoIt-Archive-Util / An archive tool built with 7-Zip and AutoIT: AutoIt-Archive-Util

2021-0330-163904.png

儘管如此,要用指令列才能解壓縮的話也太麻煩了吧。所以我把這個功能整合到我之前開發的「AutoIt-Archive-Util」上了。

2021-03-30_163349.png

要解壓縮檔案的時候,我只要把檔案「傳送到」AutoIt-Archive-Util中的zip-archive-charset-util.exe。

2021-03-30_164118.png

這時候可以設定代碼頁(code page)。

2021-03-30_164312.png

這樣就能夠順利解壓縮囉。AutoIt-Archive-Util內建會把原本的壓縮檔刪除,所以ex_style.zip也會被放到資源回收桶裡面。

AutoIt-Archive-Util的相關連結如下。如果有人感興趣的話,我之後再寫一篇介紹。


結語 / In closing

1200px-7ziplogo.svg.png

(圖片來源:維基百科)

這篇介紹如何使用7-Zip來處理含有日文檔名的ZIP壓縮檔,並確保用正確的編碼解壓縮。跟其他解壓縮方案相比,7-Zip是常用熟悉的壓縮工具,不需要額外安裝其他軟體。但7-Zip使用參數「cp」解壓縮的方式必須在指令列裡面操作,對一般人來說操作起來不太方便。所以我最後提供了AutoIt-Archive-Util來解決這個問題。

事實上,這篇一開始就是為了擴充AutoIt-Archive-Util的功能而做的功課。本來我還以為要處理亂碼問題需要搭配更多工具,結果沒想到直接使用參數「cp」就完成了,比預想來的簡單。


那麼這次使用7-Zip解壓縮含有亂碼檔名ZIP檔案的教學就到這裡了。寫到這裡,我很好奇大家現在偏好使用的壓縮格式是什麼呢?

  • A. RAR:因為電腦都內建WinRAR,所以我也壓縮成RAR。
  • B. ZIP:誰可以告訴我臺灣的郵遞區號現在是5碼、3+2碼、還是3+3碼?
  • C. 7z:沒有什麼局面是齊里亞斯無法解決的。如果有,那就來個合體的齊里亞斯。

歡迎在下面的留言處跟我們分享你的想法。大家的意見是我繼續分享的動力喔!如果你覺得我這篇實用的話,請幫我在AddThis分享工具按讚、將這篇分享到Facebook等社群媒體吧!

感謝你的耐心閱讀,我是布丁,讓我們下一篇見。

總共30 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 回覆刪除
    回覆
    1. 回覆刪除
  2. 回覆刪除
    回覆
    1. 回覆刪除
  3. 回覆刪除
    回覆
    1. 回覆刪除
  4. 回覆刪除
    回覆
    1. 回覆刪除
  5. 回覆刪除
    回覆
    1. 回覆刪除
    2. 回覆刪除
    3. 回覆刪除
  6. 回覆刪除
    回覆
    1. 回覆刪除
  7. 回覆刪除
  8. 回覆刪除
    回覆
    1. 回覆刪除
  9. 回覆刪除
    回覆
    1. 回覆刪除
  10. 回覆刪除
  11. 回覆刪除
  12. 回覆刪除
  13. 回覆刪除
    回覆
    1. 回覆刪除
  14. 回覆刪除