經過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 做些其他應用~ :)
沒有留言:
張貼留言