在linux中時常會碰到亂碼的問題,前兩天和fxq討論了一下這個問題,現(xiàn)總結(jié)如下。先通過一個實(shí)驗(yàn)來說明問題:我的/etc/sysconfig/i18n中的配置為LANG="zh_CN.UTF-8",即我的系統(tǒng)使用的UTF-8字符集,我的終端中的設(shè)定字符編碼為當(dāng)前區(qū)域UTF-8,我的終端輸出是正常的。現(xiàn)在把設(shè)定字符編碼改為GB18030,然后在一個有中文文件名的目錄下執(zhí)行l(wèi)s -l,發(fā)現(xiàn)ls自己輸出的“總計”兩個字和所有中文文件名都是亂碼,如果把LANG改為zh_CN.GB18030,那么"總計"這兩個字可以正常顯示,但是文件名仍然是亂碼,也就是說程序(ls)的輸出會根據(jù)當(dāng)前的LOCALE選擇相應(yīng)的字符集,而文件名是按照原來的LOCALE指定的編碼寫到磁盤中的,不會再隨當(dāng)前的LOCALE發(fā)生。不管是程序自己輸出的,還是文件名,都要滿足查看使用的字符集和文字本身的字符集是一致的。 為什么在掛載U盤的時候要指定字符集,這是因?yàn)閣indows對于文件名是強(qiáng)制使用UNICODE編碼的,需要linux中的vfat這個文件系統(tǒng)把UNICODE轉(zhuǎn)化為終端可以識別的字符集。 UNICODE字符集包含了各種文字的編碼,以兩個字節(jié)表示一個字符,。在UNICODE中以兩個0表示字符串的結(jié)束,這樣在linux上處理unicode的字符串不是很方便。于是linux采用了另外一種字符集utf-8,它是把unicode的一種一一映射,原來UNICODE使用0加上一個字符表示的那些字符轉(zhuǎn)化成一個字符,比如ASCII碼,而原來用兩個非0字節(jié)表示的字符而用3個字節(jié)來表示: echo "中國" > test wc -c test 7 結(jié)果是7,是因?yàn)檫€包括一個回車符0xa |