« 圈數字 | Main | LaTeX 如何將程式碼嵌入 PDF? »
處理 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 的方式來達成,無法就地編輯的方式來達成。
Perl 那行可以改成這樣...
perl -pi -e 's/許/麼/' bg5.txt
perl -pi -e 's/\Q許\E/麼/' bg5.txt
awk 我測試的結果是可以的啊
造的是大大使用的command;
在 CentOS, LANG=zh_TW.big5
| « | 三月 2010 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||