2016年12月25日 星期日

解決「包含『中文檔名』之壓縮檔,出現『亂碼』」的問題

最近收到一個在 Windows 裏壓縮的檔案,由於內含「中文檔名」,雖然 Linux 可以解壓縮,不過「中文檔名」卻變成「亂碼」,根本猜不出來。
  以前貪圖方便,就用「虛擬機」中的 Windows 來解壓縮,並利用「共享資料夾」複製回 Linux 中使用。只為了這點小事就開啟 Windows「虛擬機」,覺得有些小題大作。就想在 Linux 中直接解決這個問題。找了一些資料,整理出相關資訊如下:

安裝 convmv 內碼轉換套件

Linux 裏有個套件 convmv,是專用設計來轉換 不同的內碼,先安裝它
[root@Celeron-D ~]# dnf install convmv
安裝後,所有的使用者都可以用它。

壓縮檔之解壓縮

接著,在解壓縮時加上〝LANG=C〞這個環境變數,
[SiB@Celeron-D Temp]$ LANG=C unzip 中文檔名.zip
:將壓縮檔複製到新目錄再解壓縮,待會操作轉換檔名內碼時,才不會影響其它檔案。

上例的〝LANG=C〞是『暫時』將語言環境設為「英文內碼」,也就是『en-US』。這時列出來的檔名仍是『亂碼』,不過該「內碼」的二進位是正確的(:這很重要,可確保等一下轉換「內碼」時,不會出錯)。如果習慣使用其它『解壓縮』程式,就將〝unzip〞換成其它程式名稱。

轉換檔名之「內碼」

這時就可以用 convmv 來轉換「內碼」,指令如下
[SiB@Celeron-D Temp]$ convmv -f big5 -t utf8 -r --notest *
上例中的各項參數請參考下表說明,其中的『big5』及『utf8』是「內碼」的名稱,需要時可以換成別的「內碼」,而『 * 』是指定所有檔名。
  幾個 convmv 的常用參數列表說明如下:
參  數作  用  說  明
-f  來源編碼將目前「內碼」強制視為『來源編碼』所指定之「內碼」系統。
-t  目的編碼將目前「內碼」轉換為『目的編碼』所指定之「內碼」系統。
-r同時處理『目前工作目錄』及以下各『子目錄』中之檔名。
--list列出目前 convmv 所有可處理之「內碼」系統。
--notest實際執行『內碼轉換』。未加此參數時,convmv 預設只顯示轉換後的檔名,讓使用者確認所下命令是否正確。

已測試版本:

  • Fedora: 25

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)