作業系統‎ > ‎Ubuntu‎ > ‎

Ubuntu的unzip出現windows中文檔案的亂碼?!網路上的最佳解法-重新編譯

張貼者:2010年10月12日 下午5:58Wei-Chang Lin   [ 已更新 2010年11月17日 下午11:17 ]
經過google之後,大多數人採用的第一種應急措施就是不使用Ubuntu內帶的Unzip程式,改用如7-Zip、PeaZip等其他壓縮程式來解決這問題(最快又穩當的方法就是使用wine然後外掛winzip或winrar囉!),總之,能解決該死的Big5問題就是好方法,所以也請大家多多愛用Unicode來存檔案 :)

個人最常用的解法是第一個,其他的作法就請自行參考:
-----------------------------------------作法一-------------------------------------
以下文章來源:http://louis3c.blogspot.com/2009/08/ubuntu-big5-convert-to-utf-8.html

在Ubuntu下要將內文為Big5轉換為UTF-8可以使用iconv

1.開啟終端機(Terminal)

2.輸入下列命列
iconv -f big5 -t utf8 src_filename -o output_filename

src_filename:big5編碼檔案
output_filename:utf8編碼檔案
------------------------------------------作法二--------------------------------------
以下文章來源: http://blog.yam.com/kenshinn/article/3161348

原因發生是在windows下winzip對zip檔的type設定錯誤,
linux下暫時先用leeym 大大的 patch來解決
以下是以ubuntu為例:

1.取得unzip的source
#apt-get source unzip
接著會產生 unzip-版本的目錄(筆者測試時為unzip-5.52)

2.修改unzpriv.h
找到_OEM_INTERN
將此區段中,
*p = native((*p & 0x80) ? oem2iso[*p & 0x7f] : *p);}
改為
*p = native(*p);}

3.重新編譯unzip
#make -f unix/Makefile generic
產生的unzip檔案,再換掉原來的/usr/bin/unzip
如此unzip才能正確解出屬於該檔案編碼的檔案

即使做了上述修改
unzip在utf8下解出來的依然是亂碼
但修正過後的亂碼已經可以用convmv來處理了

----------------------------------------作法三-----------------------------------------
以下文章來源:http://plog.longwin.com.tw/news-unix/2008/07/15/convmv_utf8_big5_convert_linux_2008

Linux: 轉換 檔案名稱 的編碼 convmv (UTF-8/Big5 互轉)

當整個目錄裡面都是 Big5 的檔案, 然後要全部轉成 UTF-8 的時候, 想到就很累, 這就是當初要把 Terminal 都轉換成 UTF-8 其中一個障礙.

不過那時候找到一隻 script, 程式寫法大概就是 echo 現在的檔名, 然後用 iconv 轉成 UTF-8, 再 mv 把檔名換掉.

程式如下: (已不知來源為何, 若有人知道, 還請告知此程式來源, 將立即補上)

#!/bin/sh
# this script changes big5 chinese file/directory name to utf8 file/directory name.
# It will recursive.
# it can handle the file name containing space.
# when you use this script, please change to the directory that you want to transfer files' name.
# then execute like "~/ic2"
# i hope this script will not impact anything that will crash your system.
# this script works fine for me.

DIR="."

for I in * ; do
    echo "check... $I"
    f=`echo "$I" | iconv -f big5 -t utf8`
    if [ $? = 0 ]; then
        if  [ "$I" != "$f" ];then
            echo "$f"
#            cp -rv "$I" ~/cbackup/
            mv -v "$I" "$f"
            if [ $? = 0 ];then
                rm -rfv ~/cbackup/"$I"
            else
                echo "$f"
                exit 1;
            fi
        else
            echo "skip $I"
        fi
    else
        echo "skip $I"
    fi
done
echo "ok!"

#following from cynosure
for J in * ; do
    if [ -d "$J" ]
    then
        path=`pwd`
        echo "dir ""$J" #where am i
        cd  "$path""/""$J"
        ~/bin/ic2
        cd "$path"
    fi
done
ls *
exit 1;

此 script 我有做過一些修改, 會直接執行, 不會進行備份或測試的動作, 所以建議不熟先不要亂玩.. :P

我有另外將此 script 再 cp, 主要是來做還原等等的 script, 主要都是 copy 後修改 iconv, 來做事後處理, 例如:

  • iconv -f big5 -t utf8
  • iconv -f utf8 -t big5
  • iconv -f gb2312 -t utf8
  • iconv -f utf8 -t gb2312

不過現在有另外一隻更方便的程式囉~ 就是下述:

這隻主要是隻 Perl script, 該做 轉換/備份/測試/偵測環境 等等, 都寫的蠻完整的.

convmv 轉換編碼指令

  • convmv -f big5 -t utf-8 -r --notest *
  • -f big5: 從 Big5 編碼轉換 (不過標準應該是要寫 big5-eten, 但是我測試 big5 也可以動. :P)
  • -t utf-8: 轉換編碼到 UTF-8
  • -r: 遞迴的將目錄下的所有檔名都做轉換
  • --notest: 如果不下這個, 一切動作都只是測試, 會直接將轉換前和轉換後的檔名列給你看, 這加下去, 才會實際轉換檔名.
  • *: 所有檔案

其他參數

  • --list : 列出所有可用的編碼
  • --unescape : 轉換檔名中 %xx 這種 16 進位的編碼 (mv "./a%20x.jpg" "./a x.jpg")
  • --lower : 將所有檔名都轉小寫(ex: convmv --lower LOWER.txt)
  • --upper : 將所有檔名都轉大寫
  • -i : 互動模式, 轉換前會先經過 y/n 確認
  • 更多詳細可 man convmv 或 convmv --help, 除此之外, 可以另外再搭配 rename 做些其他應用~ :)

Comments