LGJ Notes

蒙古大夫 2.0。 這裡紀錄的都不是我的專業,我的專業就是不專業。別傻了,什麼是專業?

« 圈數字 | Main | LaTeX 如何將程式碼嵌入 PDF? »

許功蓋:中文字的替換
2006/08/28,21:44 :: 點閱次數 (12486)
現在許多人都使用 UTF-8 的環境了。但是由於一些包袱,無法完完全全的轉移到 UTF-8 環境,例如一些舊文件、舊程式。幸好 Vim 對各地區性編碼都有支援,包括了我們的 Big-5 碼。


處理 Big-5 碼,最讓人頭疼的就是著名的『許功蓋』的問題,這些字,含有一些一般環境不被認同的字元,會被當做其他解釋,這時處理時就會誤解為其他含意,而不是原來的中文字了。

例如,我們想把文章中的『許』替換成『麼』,我們用 sed/awk/perl/ruby 來試試看(以下是在 Big-5 環境):

[edt1023@lgj ~]$ sed -i -e 's/許/麼/' bg5.txt
sed: 1: "s/許/麼/": unterminated substitute in regular expression

[edt1023@lgj ~]$ awk 'gsub(/許/,"麼") {print}' bg5.txt
awk: non-terminated regular expression 許/,"麼") ... at source line 1
 context is
         ﹥﹥﹥  ﹤﹤﹤ 
awk: syntax error at source line 1
        missing )
awk: bailing out at source line 1

[edt1023@lgj ~]$ perl -pi -e 's/許/麼/' bg5.txt
Substitution replacement not terminated at -e line 1.

[edt1023@lgj ~]$ ruby -pi -e 'gsub(/許/,"麼")' bg5.txt
-e:1: unterminated string meets end of file
-e:1: parse error, unexpected tSTRING_END, expecting
tSTRING_CONTENT or tREGEXP_END or tSTRING_DBEG or 
tSTRING_DVAR

看到了嗎?通通不行!

因為這些程式是以 single byte 的方式來處理,並不認得我們 Big-5 碼的 double byte 的編碼方式,會從中去切開來解析,碰到特殊字元就會被解讀成另外一個意義去了。

Vim 可以支援 locale,他會視 locale 的設定來變換該使用的編碼環境,我們就來使用 vim 試試看:

vim --noplugin -esn -c %s/許/麼/g -c wq! bg5.txt

他是 OK 的,能很順利的處理 Big-5 中文,不怕『許功蓋』的問題。但是這有一個缺點,那就是不接受 sh pattern,例如 *.txt 之類的,來進行多檔處理。不過,在 sh 下,我們可以利用 sh for loop 來達成多檔處理的目的:

for f in *.txt
do
  vim --noplugin -esn -c %s/許/麼/g -c wq! $f
done

這樣就成了。vim 後所接的參數主要是不讓他進入 vim 編輯器,也可以去處理檔案,並把一些不必要的東西不去載入,改用 ex mode,來加快他的啟動速度。Vim 也是可以拿來這樣用喔!:-D


【更正:Tue Sep 5 18:29:38 CST 2006】
Ruby 可以指定編碼的方式來避開『許功蓋』的問題:

ruby -Ke -pi -e 'gsub(/么/,"麼")' bg5.txt
感謝 luke(小路)的指正。python 雖然也可以指定編碼,但他是以註解的方式來表現,無法用於命令列的一行文行形式。perl 也是可以指定編碼,但只對 stdin/stdout 有效,要使用 pipe 的方式來達成,無法就地編輯的方式來達成。

迴響

Comment Icon

Perl 那行可以改成這樣...
perl -pi -e 's/許/麼/' bg5.txt

Posted by: 路人甲 at 2007/01/11, 01:37
Comment Icon

perl -pi -e 's/\Q許\E/麼/' bg5.txt

Posted by: 路人甲 at 2007/01/11, 01:38
Comment Icon

awk 我測試的結果是可以的啊
造的是大大使用的command;
在 CentOS, LANG=zh_TW.big5

Posted by: Spancer at 2007/05/25, 15:57
 
Accessible and Valid XHTML 1.0 Strict and CSS Powered by BS2 Blog