中文字處理的問題

最近在用 sed 處理中文資料的時候,發現經過處理後,有少數字會變成亂碼,後來才知道原來是 locale 沒設定好。

$ echo '65,3,"1111","謝婷雯","xxx@yahoo.com.tw'| sed 's/@/","/g'

結果得到:

65,3,"1111","謝?,"雯","xxx","yahoo.com.tw

我在自己帳號下的 .bash_profile 裡面加上 LC_ALL=zh_TW.Big5 之後:

$ echo '65,3,"1111","謝婷雯","xxx@yahoo.com.tw'| sed 's/@/","/g'

結果就是

65,3,"1111","謝婷雯","xxx","yahoo.com.tw

說明:

locale 的環境變數設定有下列幾個:

  1. LC_CTYPE: 字元分類及處理方式。
  2. LC_COLLATE: 字元順序與字串比較。
  3. LC_MESSAGES: 程式中用何種語言來顯示訊息。
  4. LC_MONETARY: 貨幣顯式格式。
  5. LC_NUMERIC: 數字顯式格式。
  6. LC_TIME: 日期與時間的顯式格式。
  7. LC_ALL: 此類別可以一次設定以上所有的類別。
  8. LANG: 作用類似 LC_ALL,也可用來一次設定所有的 locale 環境。

使用 locale 這個程式可以看到目前 locale 的設定情形:

> locale
LANG=en_US.UTF-8
LC_CTYPE=”zh_TW.Big5″
LC_NUMERIC=”zh_TW.Big5″
LC_TIME=”zh_TW.Big5″
LC_COLLATE=”zh_TW.Big5″
LC_MONETARY=”zh_TW.Big5″
LC_MESSAGES=”zh_TW.Big5″
LC_PAPER=”zh_TW.Big5″
LC_NAME=”zh_TW.Big5″
LC_ADDRESS=”zh_TW.Big5″
LC_TELEPHONE=”zh_TW.Big5″
LC_MEASUREMENT=”zh_TW.Big5″
LC_IDENTIFICATION=”zh_TW.Big5″
LC_ALL=zh_TW.Big5

參考資料:

http://xcin.linux.org.tw/i18n/pc2000/p2/node4.html