文章目錄
一、字符編碼和字符集
1、字符編碼(character encoding):
字符編碼是一種法則,在數字與符號之間建立的對應關係。不同的國家有不同的語言,包含的文字、標點符號、圖形符號各有不同。例如在ASCII編碼中,用數字97表達字符’a’與字符集相對應,常見的字符編碼有ASCII,GBK,GB18030,Unicode等。
2、字符集(Character set)
字符集是字符的集合,字符是文字和符號的總稱,用ASCII編碼的字符集稱之爲ASCII字符集,用GBK編碼的字符集稱之爲GBK字符集。
3、國際編碼(Unicode)
爲了解決傳統的字符編碼方案的侷限,1994年發佈了Unicode(國際編碼、統一碼、萬國碼、單一碼、通用碼),它是計算機科學領域裏的一項業界標準,包括字符集、編碼方案等。Unicode 將全世界所有的字符統一化,統一編碼,再也不存在字符集不兼容和字符轉換的問題。
Unicode 有以下三種編碼方式:
1)UTF-8:兼容ASCII編碼;拉丁文、希臘文等使用兩個字節;包括漢字在內的其它常用字符使用三個字節;剩下的極少使用的字符使用四個字節。
2)UTF-16:對相對常用的60000餘個字符使用兩個字節進行編碼,其餘的使用4字節。
3)UTF-32:固定使用4個字節來表示一個字符,存在空間利用效率的問題。
二、漢字的編碼
1、漢字的編碼
支持漢字(簡體中文)的編碼有GB2312、GB13000、GBK、GB18030和Unicode(UTF-8、UTF-16、UTF-32)。
1)GB2312
僅包含大部分的常用簡體漢字,但已經不能適應現在的需要。
2)GB13000
由於GB2312的侷限性,國家標準化委員會制定了GB13000編碼;但由於當時的硬件和軟件都已經支持了GB2312,而GB13000與GB2312完全不兼容,所以沒有能夠得到大範圍的推廣使用。
3)GBK
有了GB13000的教訓,中國國家標準化委員會制定了GBK標準,併兼容了GB2312標準,同時在GB2312標準的基礎上擴展了GB13000包含的字;由於該標準有微軟的支持,得到了廣泛的應用。
4)GB18030
GB18030編碼比GBK又新增了幾千個漢字,但由於碼位不足使用了2byte與4byte混合編碼方式,這給軟件開發增加了難度。
5)Unicode
包含全世界所有國家需要用到的字符,是國際編碼,通用性強。
2、漢字的編碼選擇
在操作系統和數據庫中,常用的漢字編碼有GBK、GB18030和Unicode,GBK和GB18030的優勢是佔用空間小,Unicode的優勢是全球化的支持。
在應用開發中,如果不考慮全球化,最好的選擇是GBK和GB18030。
3、編碼的轉換
GBK和GB18030與Unicode編碼之間需要轉換,否則會出現漢字亂碼。
三、設置Linux的字符集
1、查看當前系統已安裝的字符集
1)locale命令用於查看當前系統全部的已安裝的字符集,Linux支持的符集約800種。
locale -a
2)查看已安裝的中文字符集(只查看中國大陸的,不包括香港和臺灣)
locale -a|grep zh_CN
上圖表示已經安裝了中文字符集。
2、安裝中文字符集
如果您的Linux系統沒有安裝中文字符集,可以用yum命令安裝。
我查了一些資料,安裝中文字符集軟件包的方法比較多,沒找到準確的說法,所以把多種方法都寫了進來,以下命令都可以執行,不會有副作用。
yum -y groupinstall chinese-support
yum -y install chinese-support
yum -y install kde-l10n-Chinese
yum -y install ibus-table-chinese-1.4.6-3.el7.noarch
安裝後,執行locale -a|grep zh_CN
,如果顯示的內容如下,表示安裝成功。
3、修改字符集配置文件
CentOS6.x 字符集配置文件在/etc/sysconfig/i18n文件中。
CentOS7.x 字符集配置文件在/etc/locale.conf文件中,內容如下:
執行以下命令或者重啓系統使修改生效。
CentOS6.x
source /etc/sysconfig/i18n
CentOS7.x:
source /etc/locale.conf
四、LANG環境變量
LANG環境變量存放的是Linux系統的語言、地區、字符集,它不需要系統管理員手工設置,/etc/profile會調用/etc/profile.d/lang.sh腳本完成對PATH的設置。
五、修改客戶端的字符集
客戶端的字符集必須與Linux服務端一致,否則會出現亂碼,以SecureCRT爲例。修改會話的屬性,在Appearance界面中的Character
encoding下拉框中選擇。
六、字符集轉換工具
Linux提供了iconv命令把文件內容從一種編碼轉換成另一種編碼。
參數說明:
--list:列出iconv支持的編碼列表。
-f encoding:源文件內容的編碼。
-t encoding:目標文件內容的編碼。
-o file:指定輸出文件。
-c:忽略輸出的非法字符。
-l:列出已知的編碼字符集。
-s:禁止警告信息,但不是錯誤信息。
--verbose:顯示進度信息。
示例:
把當前目錄的book1.c由gbk轉換成utf-8,結果輸出到/tmp/book1_utf8.c中。
iconv -f gbk -t utf-8 book1.c -o /tmp/book1_utf8.c
七、應用經驗
1)Linux系統在業務化之前,就應該確定字符集,然後不再改變。系統在業務化後,修改字符集是一件很麻煩的事情,最好別惹這個麻煩。
2)如果項目沒有全球化的需求,Linux的字符集建議採用zh_CN.gbk。
3)雖然gb18030字符集比gbk更豐富,但是gb18030中有部分漢字是4字節,這一點讓程序員很鬱悶,所以,程序員更傾向gbk字符集。
4)設置Linux的字符集時,還要考慮WEB系統和數據庫系統採用的字符集,最好是大家都保持一致。
八、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!