On Mon, 11 Sep 2000, allen wrote:
嗨!大家好:
不知各位在翻譯時,有沒有遇到以下問題
大家應該都知道有些中文字會有脫逸字元(\)的問題
在我使用
bg5cc filename.pox filename.po
轉換檔案後,再使用
msgfmt -v -o /dev/null filename.po
就會出現很多出現重大錯誤的訊息
檢查後,就發現全部的錯誤都是在有脫逸字元的地方
bg5cc 似乎會把脫逸字元(\)轉成(\\)
這就是bg5cc 的功能阿
因為在C與多數語言的定義中, "\"會使得所連接的自原有特殊的作用
eg. "\n"為換行符號, "\t"為tab定位點, "\\"為"\"
偏偏有些中文字用到了"\"字元來組字....
complier 就錯亂了說, 所以要把中文字中的"\"變成"\\"
然後在編譯的過程中"\\"會被還原成正常的"\"
而 msgfmt 卻又把(\\)當成錯誤字元
其實問題不是在megfmt, 而是在bg5cc 🙁
bg5cc 的識別有點笨, 他只會找尋不是有效的"\"標記, 並增加一個"\"成為"\\"
eg. "\"後面不是跟著"n","t","r","\"...etc.
問題就來了, 當一個中文字含有這樣的符號時
eg. 珮n == [alt-175]\n
bg5cc 便會將之變成 '珮\n' ([alt-175]\\n), compiler 在將之還原成[alt-175]\n
但當您再做一次bg5cc 時, 他把 '珮\n' 又變成了 '珮\\n'
i.e. [alt-175]\\\n
而編譯器會將之當作 [alt-175]\[換行] (第一個"\"來自"\\", 將"\n"翻譯成換行字元)
這當然不是我們所預期的結果, 所以 msgfmt 才會回報錯誤
有人有遇到類似的問題嗎?
解決的方法 小虫 兄在cle-devel 上有提供過
(轉載於
http://i18n.linux.org.tw/howto.php3)
基本上就是在翻譯檔案前, 先用 sed 把 "\\" 還原成 "\", 指令如下
cat filename.po | sed 's/\\\\/\\/g' > filename.pox
或是您可以使用 Plasma 兄所提供的 bg5cc.pl 來取代原本的bg5cc
便可以省掉還原的動作, 因為他的程式較聰明, 不會把 "\\" 變成"\\\"
您也可以在前述網址找到這個script
Shyue
^_________^
Allen Huang
lancelot(a)pchome.com.tw