中文字處理的問題
最近在用 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 的環境變數設定有下列幾個:
- LC_CTYPE: 字元分類及處理方式。
- LC_COLLATE: 字元順序與字串比較。
- LC_MESSAGES: 程式中用何種語言來顯示訊息。
- LC_MONETARY: 貨幣顯式格式。
- LC_NUMERIC: 數字顯式格式。
- LC_TIME: 日期與時間的顯式格式。
- LC_ALL: 此類別可以一次設定以上所有的類別。
- 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