2010年10月12日 星期二

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

經過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 做些其他應用~ :)


沒有留言:

張貼留言