解壓縮zip檔案,遇到檔案名稱是big5編碼,產生亂碼時,如何解決?

原始討論

測試環境

  • Xubuntu 16.04 64位元 英文界面

說明

在linux的環境底下,解壓縮zip檔案時,會遇到亂碼的情形,通常是遇到檔名是「非utf-8」編碼,

最常見的如下面的案例,遇到的檔案名稱的編碼是「big5」編碼。

前置作業

執行下面指令,安裝「unzip」這個套件。

$ sudo apt-get install unzip

下載案例檔案

執行下面的指令,下載「案例檔案」

$ wget -c 'http://www.cns11643.gov.tw/AIDB/Open_Data.zip' -O Open_Data.zip

「檔案連結」請參考原始網頁「1」,「2」的說明,撰寫此文時是下載「105年6月15日更新」的版本。

觀看檔案列表

執行下面指令,觀看檔案列表

$ unzip -l Open_Data.zip

會看到有些檔名是呈現亂碼的狀態。

所以改執行

$ unzip -O big5 -l Open_Data.zip

就可以看到正常的顯示

Archive:  Open_Data.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-08-25 16:28   Open_Data/
        0  2016-08-25 16:32   Open_Data/Fonts/
134406861  2016-08-25 16:32   Open_Data/Fonts/png_24x24.zip
 52450272  2015-11-26 18:41   Open_Data/Fonts/TW-Kai-98_1.ttf
 64296220  2015-07-09 09:54   Open_Data/Fonts/TW-Kai-Ext-B-98_1.ttf
 34466036  2016-08-25 09:28   Open_Data/Fonts/TW-Kai-Plus-98_1.ttf
 35747160  2015-08-05 17:08   Open_Data/Fonts/TW-Sung-98_1.ttf
 64868200  2016-05-10 15:23   Open_Data/Fonts/TW-Sung-Ext-B-98_1.ttf
 31316016  2016-08-25 09:30   Open_Data/Fonts/TW-Sung-Plus-98_1.ttf
      500  2012-06-18 11:41   Open_Data/Fonts/全字庫字型說明文件.txt
        0  2015-01-13 16:33   Open_Data/MapingTables/
        0  2015-01-13 16:33   Open_Data/MapingTables/Big5/
   339328  2012-06-13 18:11   Open_Data/MapingTables/Big5/CNS2BIG5.txt
   102806  2012-06-13 18:11   Open_Data/MapingTables/Big5/CNS2BIG5_Big5E.txt
      184  2012-06-13 18:11   Open_Data/MapingTables/Big5/CNS2BIG5_七個倚天外字.txt
    11494  2012-06-13 18:11   Open_Data/MapingTables/Big5/CNS2BIG5_符號.txt
   226730  2009-11-13 11:25   Open_Data/MapingTables/CNS2DCI.txt
   342512  2009-11-13 10:58   Open_Data/MapingTables/CNS2FIN.txt
    71344  2009-05-15 11:13   Open_Data/MapingTables/CNS2INC.txt
   321105  2009-11-13 10:59   Open_Data/MapingTables/CNS2TAX.txt
        0  2016-08-25 16:28   Open_Data/MapingTables/Unicode/
   268792  2016-08-25 16:27   Open_Data/MapingTables/Unicode/CNS2UNICODE_Unicode 15.txt
   617668  2016-08-25 16:27   Open_Data/MapingTables/Unicode/CNS2UNICODE_Unicode 2.txt
   469993  2016-08-25 16:27   Open_Data/MapingTables/Unicode/CNS2UNICODE_Unicode BMP.txt
     3934  2015-08-11 11:37   Open_Data/MapingTables/全字庫中文對照表說明文件.txt
        0  2015-01-13 16:33   Open_Data/MapingTables/地政/
    21525  2009-11-13 09:46   Open_Data/MapingTables/地政/南投縣.txt
    22876  2009-11-13 09:46   Open_Data/MapingTables/地政/台中市.txt
    23226  2009-11-13 09:46   Open_Data/MapingTables/地政/台中縣.txt
    63942  2009-11-13 09:47   Open_Data/MapingTables/地政/台北市.txt
    58134  2009-11-13 09:47   Open_Data/MapingTables/地政/台北縣.txt
    17276  2009-11-13 09:47   Open_Data/MapingTables/地政/台南市.txt
    40502  2009-11-13 09:47   Open_Data/MapingTables/地政/台南縣.txt
    24766  2009-11-13 09:47   Open_Data/MapingTables/地政/台東縣.txt
    10403  2009-11-13 09:47   Open_Data/MapingTables/地政/嘉義市.txt
    29610  2009-11-13 09:47   Open_Data/MapingTables/地政/嘉義縣.txt
     7434  2009-11-13 09:47   Open_Data/MapingTables/地政/基隆市.txt
    42957  2009-11-13 09:47   Open_Data/MapingTables/地政/宜蘭縣.txt
    29666  2009-11-13 09:47   Open_Data/MapingTables/地政/屏東縣.txt
    37632  2009-11-13 09:47   Open_Data/MapingTables/地政/彰化縣.txt
     5194  2009-11-13 09:47   Open_Data/MapingTables/地政/新竹市.txt
     3864  2009-11-13 09:47   Open_Data/MapingTables/地政/新竹縣.txt
    24988  2009-11-13 09:47   Open_Data/MapingTables/地政/桃園縣.txt
    29960  2009-11-13 09:47   Open_Data/MapingTables/地政/澎湖縣.txt
      938  2009-11-13 09:47   Open_Data/MapingTables/地政/花蓮縣.txt
     7266  2009-11-13 09:47   Open_Data/MapingTables/地政/苗栗縣.txt
      378  2009-11-13 09:47   Open_Data/MapingTables/地政/連江縣.txt
     4550  2009-11-13 09:48   Open_Data/MapingTables/地政/金門縣.txt
    38458  2009-11-13 09:48   Open_Data/MapingTables/地政/雲林縣.txt
    20132  2009-11-13 09:48   Open_Data/MapingTables/地政/高雄市.txt
    36930  2010-07-01 14:50   Open_Data/MapingTables/地政/高雄縣.txt
        0  2016-08-25 16:27   Open_Data/Properties/
  1171461  2016-08-25 16:27   Open_Data/Properties/CNS_cangjei.txt
  2011814  2016-08-25 16:27   Open_Data/Properties/CNS_component.txt
    10936  2012-07-16 15:15   Open_Data/Properties/CNS_component_word.txt
   349210  2016-06-27 16:59   Open_Data/Properties/CNS_component_word.zip
  1865405  2016-08-25 16:27   Open_Data/Properties/CNS_phonetic.txt
    46532  2012-07-13 13:50   Open_Data/Properties/CNS_pinyin.txt
  1003863  2016-08-25 16:27   Open_Data/Properties/CNS_radical.txt
     5778  2015-08-25 13:36   Open_Data/Properties/CNS_radical_word.txt
  1055732  2016-08-25 16:27   Open_Data/Properties/CNS_stroke.txt
  2063780  2016-08-25 16:27   Open_Data/Properties/CNS_strokes_sequence.txt
     3188  2016-06-28 13:59   Open_Data/Properties/全字庫屬性資料說明文件.txt
---------                     -------
430517461                     63 files

解壓縮

執行下面指令,將檔案解壓縮

$ unzip -O big5 Open_Data.zip

顯示

Archive:  Open_Data.zip
   creating: Open_Data/
   creating: Open_Data/Fonts/
  inflating: Open_Data/Fonts/png_24x24.zip  
  inflating: Open_Data/Fonts/TW-Kai-98_1.ttf  
  inflating: Open_Data/Fonts/TW-Kai-Ext-B-98_1.ttf  
  inflating: Open_Data/Fonts/TW-Kai-Plus-98_1.ttf  
  inflating: Open_Data/Fonts/TW-Sung-98_1.ttf  
  inflating: Open_Data/Fonts/TW-Sung-Ext-B-98_1.ttf  
  inflating: Open_Data/Fonts/TW-Sung-Plus-98_1.ttf  
  inflating: Open_Data/Fonts/全字庫字型說明文件.txt  
   creating: Open_Data/MapingTables/
   creating: Open_Data/MapingTables/Big5/
  inflating: Open_Data/MapingTables/Big5/CNS2BIG5.txt  
  inflating: Open_Data/MapingTables/Big5/CNS2BIG5_Big5E.txt  
  inflating: Open_Data/MapingTables/Big5/CNS2BIG5_七個倚天外字.txt  
  inflating: Open_Data/MapingTables/Big5/CNS2BIG5_符號.txt  
  inflating: Open_Data/MapingTables/CNS2DCI.txt  
  inflating: Open_Data/MapingTables/CNS2FIN.txt  
  inflating: Open_Data/MapingTables/CNS2INC.txt  
  inflating: Open_Data/MapingTables/CNS2TAX.txt  
   creating: Open_Data/MapingTables/Unicode/
  inflating: Open_Data/MapingTables/Unicode/CNS2UNICODE_Unicode 15.txt  
  inflating: Open_Data/MapingTables/Unicode/CNS2UNICODE_Unicode 2.txt  
  inflating: Open_Data/MapingTables/Unicode/CNS2UNICODE_Unicode BMP.txt  
  inflating: Open_Data/MapingTables/全字庫中文對照表說明文件.txt  
   creating: Open_Data/MapingTables/地政/
  inflating: Open_Data/MapingTables/地政/南投縣.txt  
  inflating: Open_Data/MapingTables/地政/台中市.txt  
  inflating: Open_Data/MapingTables/地政/台中縣.txt  
  inflating: Open_Data/MapingTables/地政/台北市.txt  
  inflating: Open_Data/MapingTables/地政/台北縣.txt  
  inflating: Open_Data/MapingTables/地政/台南市.txt  
  inflating: Open_Data/MapingTables/地政/台南縣.txt  
  inflating: Open_Data/MapingTables/地政/台東縣.txt  
  inflating: Open_Data/MapingTables/地政/嘉義市.txt  
  inflating: Open_Data/MapingTables/地政/嘉義縣.txt  
  inflating: Open_Data/MapingTables/地政/基隆市.txt  
  inflating: Open_Data/MapingTables/地政/宜蘭縣.txt  
  inflating: Open_Data/MapingTables/地政/屏東縣.txt  
  inflating: Open_Data/MapingTables/地政/彰化縣.txt  
  inflating: Open_Data/MapingTables/地政/新竹市.txt  
  inflating: Open_Data/MapingTables/地政/新竹縣.txt  
  inflating: Open_Data/MapingTables/地政/桃園縣.txt  
  inflating: Open_Data/MapingTables/地政/澎湖縣.txt  
  inflating: Open_Data/MapingTables/地政/花蓮縣.txt  
  inflating: Open_Data/MapingTables/地政/苗栗縣.txt  
  inflating: Open_Data/MapingTables/地政/連江縣.txt  
  inflating: Open_Data/MapingTables/地政/金門縣.txt  
  inflating: Open_Data/MapingTables/地政/雲林縣.txt  
  inflating: Open_Data/MapingTables/地政/高雄市.txt  
  inflating: Open_Data/MapingTables/地政/高雄縣.txt  
   creating: Open_Data/Properties/
  inflating: Open_Data/Properties/CNS_cangjei.txt  
  inflating: Open_Data/Properties/CNS_component.txt  
  inflating: Open_Data/Properties/CNS_component_word.txt  
  inflating: Open_Data/Properties/CNS_component_word.zip  
  inflating: Open_Data/Properties/CNS_phonetic.txt  
  inflating: Open_Data/Properties/CNS_pinyin.txt  
  inflating: Open_Data/Properties/CNS_radical.txt  
  inflating: Open_Data/Properties/CNS_radical_word.txt  
  inflating: Open_Data/Properties/CNS_stroke.txt  
  inflating: Open_Data/Properties/CNS_strokes_sequence.txt  
  inflating: Open_Data/Properties/全字庫屬性資料說明文件.txt

就會產生一個資料夾「Open_Data」

觀看資料夾結構

執行下面指令,觀看「Open_Data」這個資料夾的結構

$ tree Open_Data

顯示

Open_Data
├── Fonts
│   ├── png_24x24.zip
│   ├── TW-Kai-98_1.ttf
│   ├── TW-Kai-Ext-B-98_1.ttf
│   ├── TW-Kai-Plus-98_1.ttf
│   ├── TW-Sung-98_1.ttf
│   ├── TW-Sung-Ext-B-98_1.ttf
│   ├── TW-Sung-Plus-98_1.ttf
│   └── 全字庫字型說明文件.txt
├── MapingTables
│   ├── Big5
│   │   ├── CNS2BIG5_Big5E.txt
│   │   ├── CNS2BIG5.txt
│   │   ├── CNS2BIG5_七個倚天外字.txt
│   │   └── CNS2BIG5_符號.txt
│   ├── CNS2DCI.txt
│   ├── CNS2FIN.txt
│   ├── CNS2INC.txt
│   ├── CNS2TAX.txt
│   ├── Unicode
│   │   ├── CNS2UNICODE_Unicode 15.txt
│   │   ├── CNS2UNICODE_Unicode 2.txt
│   │   └── CNS2UNICODE_Unicode BMP.txt
│   ├── 全字庫中文對照表說明文件.txt
│   └── 地政
│       ├── 南投縣.txt
│       ├── 台中市.txt
│       ├── 台中縣.txt
│       ├── 台北市.txt
│       ├── 台北縣.txt
│       ├── 台南市.txt
│       ├── 台南縣.txt
│       ├── 台東縣.txt
│       ├── 嘉義市.txt
│       ├── 嘉義縣.txt
│       ├── 基隆市.txt
│       ├── 宜蘭縣.txt
│       ├── 屏東縣.txt
│       ├── 彰化縣.txt
│       ├── 新竹市.txt
│       ├── 新竹縣.txt
│       ├── 桃園縣.txt
│       ├── 澎湖縣.txt
│       ├── 花蓮縣.txt
│       ├── 苗栗縣.txt
│       ├── 連江縣.txt
│       ├── 金門縣.txt
│       ├── 雲林縣.txt
│       ├── 高雄市.txt
│       └── 高雄縣.txt
└── Properties
    ├── CNS_cangjei.txt
    ├── CNS_component.txt
    ├── CNS_component_word.txt
    ├── CNS_component_word.zip
    ├── CNS_phonetic.txt
    ├── CNS_pinyin.txt
    ├── CNS_radical.txt
    ├── CNS_radical_word.txt
    ├── CNS_strokes_sequence.txt
    ├── CNS_stroke.txt
    └── 全字庫屬性資料說明文件.txt

6 directories, 56 files

另一個方式

若上面「unzip -O big5」的方式失效的話,還有另一個方式。

執行下面指令解壓縮

$ LANG=C unzip Open_Data.zip

然後透過「convmv」這個指令,把呈現亂碼的檔案名稱,改回正常的檔名。

$ convmv -f BIG5 -t UTF-8 -r Open_Data --notest

若是沒有使用「–notest」這個參數,則是觀看模擬更改的結果,並不會真的執行。

$ convmv -f BIG5 -t UTF-8 -r Open_Data

注意:要使用「convmv」這個指令,需要執行下面的指令先安裝「convmv」這個套件

$ sudo apt-get install convmv

這個方法,除了透過「unzip」來解開壓縮檔,也可以透過「7z」來解開。

$ LANG=C 7z x Open_Data.zip

然後一樣執行

$ convmv -f BIG5 -t UTF-8 -r Open_Data --notest

其他的方式

還有其他的方式,請參考上面提到的原始討論。