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