:::

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

3月 30, 2021 28 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」之後,請輸入以下指令:

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等社群媒體吧!

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

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

  1. 雖然這篇主要是在說怎麼用7-zip解決亂碼問題
    但老實說直接用Bandizip還是比較快吧? 要壓縮7z也不成問題,功能上也跟7-zip差太多
    唯一的缺點大概就是它沒有open source

    回覆刪除
    回覆
    1. To Wcw5504,

      主要是我在其他工具需要壓縮與解壓縮功能,7-zip提供的命令列介面跟開放原始碼容易使用的特性,會讓我比較偏好使用7-zip。

      刪除
  2. 我們公司則是三種壓縮軟體均有使用,因為Bandzip雖然真的蠻不錯,就編碼來說。
    但對我而言我會比較想選擇有command line支援的軟體使用,很方便日後寫腳本

    回覆刪除
    回覆
    1. To TR.M,

      我也是喜歡能夠支援命令列的工具。
      我很常用AutoIT搭配其他可以用命令列執行的軟體來建立方便的小工具,7-zip就是我愛用的工具之一。

      刪除
  3. 您好,您的AutoIt-Archive-Util下载下来要怎么运行啊

    回覆刪除
    回覆
    1. 您好,

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

      關於「傳送到」的設定,請看「Windows 10 加入捷徑至傳送到」的操作說明。
      https://www.avex.idv.tw/2018/10/03/windows-10-%E5%8A%A0%E5%85%A5%E6%8D%B7%E5%BE%91%E8%87%B3%E5%82%B3%E9%80%81%E5%88%B0/

      刪除
  4. 您好,我现在遇到一个这样的情况,别人中文繁体编码的电脑传送zip压缩档给我,我用中文简体编码的电脑解压缩是乱码,用您这个方法应该也是可以解决的吧?

    回覆刪除
    回覆
    1. 您好,

      如果您是Windows環境,那使用Bandizip比較快。
      https://tw.bandisoft.com/bandizip/

      WinRAR很難處理編碼問題。
      遇到壓縮與解壓縮問題,我一律推薦刪除WinRAR。

      刪除
  5. 想請問一下,我在解壓資料夾的時候,上面顯示「系統找不到指定的路徑」,想知道該如何處理
    顯示內容如下:

    C:\Program Files\7-Zip>7z.exe x vxace_rtp100.zip -mcp=932

    7-Zip 21.03 beta (x64) : Copyright (c) 1999-2021 Igor Pavlov : 2021-07-20

    Scanning the drive for archives:
    1 file, 194718847 bytes (186 MiB)

    Extracting archive: vxace_rtp100.zip
    --
    Path = vxace_rtp100.zip
    Type = zip
    Physical Size = 194718847

    ERROR: Cannot open output file : 系統找不到指定的路徑。 : .\RPGVXAce_RTP100\Setup-1.bin
    ERROR: Cannot open output file : 系統找不到指定的路徑。 : .\RPGVXAce_RTP100\Setup.exe
    ERROR: Cannot open output file : 系統找不到指定的路徑。 : .\RPGVXAce_RTP100\利用規約.txt

    Sub items Errors: 3

    Archives with Errors: 1

    Sub items Errors: 3

    回覆刪除
    回覆
    1. To 阿萬,

      看起來是壓縮檔本身的問題。

      你先確認看看是不是能夠用其他壓縮軟體正常解壓縮。
      如果其他壓縮軟體都無法處理,那就不行了。

      我看你這個檔案是為了玩Windows遊戲。
      如果您是Windows環境,那使用Bandizip比較快。
      https://tw.bandisoft.com/bandizip/

      刪除
    2. 謝謝你的回答
      Brandzip 的確比較快
      但當初想要試這個方法
      是因為Brandzip會改變壓縮檔的圖像
      有點小小的不喜歡
      (還是有方法可以改回拉鍊的樣式?)

      刪除
    3. To 阿萬,

      https://blog.pulipuli.info/2011/04/default-program-editorwindows7xmind.html
      在Default Programs Editor裡面可以設定檔案類型的預設圖示,也許你可以試試看。

      刪除
  6. 感想您的文章!
    我也是實在不想多裝一個壓縮軟體了ww

    回覆刪除
    回覆
    1. To xeo,

      自從我用了Linux後,我發現很多發行版都內建了壓縮跟解壓縮軟體,而且跟檔案瀏覽器整合的很好。

      https://lh3.googleusercontent.com/-XtV6_AvwHgU/YahJNURmRGI/AAAAAAAFDwI/FMCdcGHqoOoml-IIIKPXFMxpSWl35jnnQCNcBGAsYHQ/s1600/2021-12-02_12-18.png
      這是在Kubuntu裡面使用Dolphin檔案瀏覽器,跟Ark互動的操作過程。

      有7z,有zip,當然也有Linux主要使用的各種tar
      至於rar.... 何苦呢?為何不用7z?

      刪除
  7. 如果是有密碼的壓縮檔也可以使用AutoIt-Archive-Util 嗎?

    回覆刪除
    回覆
    1. 您好,

      如果你可以用7-Zip解壓縮,那就可以。
      https://www.developershome.com/7-zip/download.asp

      刪除
  8. 您好,我用了您提供的AutoIt-Archive-Util來試圖解壓縮日文zip檔案,但傳送到zip-archive-charset-util.exe之後卻沒有解壓縮後的檔案留在原地,原始的zip包還被刪除了,請問要怎麼解決呢?

    回覆刪除
    回覆
    1. To Athena Yang,

      請到資源回收桶找到原始的壓縮檔,嘗試其他解壓縮方式吧。

      刪除
  9. 你好,我的檔案是有密碼的,我要怎麼在指令列中輸入密碼來解壓縮檔案呢

    回覆刪除
    回覆
    1. ​您好,

      加上-p"密碼" 就可以了

      https://stackoverflow.com/a/28160425/6645399
      例如:
      ````
      7z a secure.7z * -p"pa$$word @|"
      ````

      刪除
  10. 十分感謝版主此篇教學,幫助非常大大大大

    回覆刪除
  11. 谢谢作者,您的方法十分有效!

    回覆刪除
  12. 感謝版主這篇教學,真是太神啦!

    回覆刪除
  13. -mcp 看起來只能用在 Windows 的樣子。我在 Mac 和 Linux 上用 -mcp=932 完全沒有效果。每次要解壓日文編碼的文件只能用 unzip -O shift-jis 或者 unar。

    回覆刪除
    回覆
    1. 對,真沒想到會有這個問題。

      我後來也是用unzip來處理。

      刪除