# 中文字處理的問題

> 

Published: 2005-02-16
URL: https://kaochenlong.com/chinese-characters-problem

---

最近在用 sed 處理中文資料的時候，發現經過處理後，有少數字會變成亂碼，後來才知道原來是 locale 沒設定好。

    $ echo &#39;65,3,&quot;1111&quot;,&quot;謝婷雯&quot;,&quot;xxx@yahoo.com.tw&#39;| sed &#39;s/@/&quot;,&quot;/g&#39;

結果得到：

    65,3,&quot;1111&quot;,&quot;謝?,&quot;雯&quot;,&quot;xxx&quot;,&quot;yahoo.com.tw

我在自己帳號下的 `.bash_profile` 裡面加上 `LC_ALL=zh_TW.Big5` 之後：

    $ echo &#39;65,3,&quot;1111&quot;,&quot;謝婷雯&quot;,&quot;xxx@yahoo.com.tw&#39;| sed &#39;s/@/&quot;,&quot;/g&#39;

結果就是

    65,3,&quot;1111&quot;,&quot;謝婷雯&quot;,&quot;xxx&quot;,&quot;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 的設定情形：

    &gt; 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


