在系統管理或一些軟件管理中,總是碰到需要設置字符集或字符編碼的地方,如果設置不正確,可能產生許多意想不到的問題。
但是在具體概念上,不僅自己,網絡上也有很多人不太理解“字符集”和“字符編碼”到底是不是一回事,或者究竟有啥不一樣?
查了些資料,加上自己的理解,做一個學習總結如下:
字符集與字符編碼有很緊密的聯繫,但不能完全劃等號,先解釋下幾個概念:
字符(Character)
字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號等。如英文字母a-z,數字0-9,漢字等。
字符集(CharacterSet)
字符集顧名思義,就是不同字符的集合。當然還包括一套將人類閱讀的字符轉換爲機器閱讀的字符(0或1)的規則。
一個字符集包含了固定數量的字符,如ASCII字符集包含A-Z、a-z、0-9、半角標點符號和特殊控制符號(如換行符)在內的128個字符;如GB2312是中國國家標準的簡體中文字符集,覆蓋99.75%的漢字等。
字符編碼(Encode)
字符編碼,就是上面提到的將人類閱讀的字符按照一定的方式轉換爲機器閱讀字符(0或1)。這套映射規則就叫字符編碼,字符編碼是基於字符集的。
一套字符集可以只有一套編碼規則,也可以有多種編碼規則。有些字符集只有一套編碼規則,而且名字和字符集名稱一致。
從上可以看出,字符集是規定字符的集合,字符編碼是把字符集的實現方式。
先看下字符的存儲方式。看下錶
字符編碼 | 每個字符字節數 |
ASCII | 1 |
UCS-2(Unicode) | 2 |
UCS-4(Unicode) | 4 |
UTF-8(Unicode) | 1 - 6 |
UTF-16(Unicode) | 2 - 4 |
GBK/GB2312(中文) | 1 - 2 |
GB18030(CJK) | 1 - 4 |
表(1)
從上表可以看出,不同的字符編碼用不同的方式表達字符集。
所以,根據所需要的字節數不同,把恆用2個字節表示一個字符的字符集(編碼),叫做雙字節字符集(Double-Byte Character Set,DBCS),其他的叫做多字節字符集(Multi-Byte Character Set,MBCS)。如上表中只有UCS-2纔是DBCS字符集。
常見的字符集
Unicode:也叫統一字符集,它包含了幾乎世界上所有的已經發現且需要使用的字符(如中文、日文、英文、德文等)。
ASCII:早期的計算機系統只能處理英文,所以ASCII也就成爲了計算機的缺省字符集,包含了英文所需要的所有字符。
GB2312:中文字符集,包含ASCII字符集。ASCII部分用單字節表示,剩餘部分用雙字節表示。
GBK:GB2312的擴展,但完整包含了GB2312的所有內容。
GB18030:GBK字符集的超集,常叫大漢字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韓三國語言中的所有字符。
常見的字符編碼,如utf8、GBK、GB2312、Big5等。見表(1)
字符集轉換
從一種字符集轉換到另一種字符集,由於原先字符集中的某些字符可能並不包含在目標字符集中,所以有可能會導致某些字符丟失。
例如GBK轉換成ASCII字符集,就會導致除了單字節字符(ASCII部分)外的所有字符丟失。
注意,計算機上以ASCII方式(其實,ASCII代表了所有的MBCS字符集)儲存文件雖然可以儲存中文,但實質上是因爲GB2312和GBK等字符集是MBCS字符集,所以才歸類到ASCII中,其實本質上還是是GBK字符集而不是ASCII字符集。
字符編碼轉換
由於字符編碼是基於字符集的,所以字符編碼不同也可能導致部分字符丟失。但如果是相同字符集裏的不同編碼,例如UTF-8(Unicode)到UTF-16(Unicode)編碼,那麼是不會丟失的,因爲它們是同一種字符集的不同表現形式。
由此我們瞭解,字符集只是定義了一些包含不同字符的集合和一些映射方式,即字符編碼。字符編碼纔是給我們使用的具體方式。
所以,我們在系統管理中經常所設置的UTF-8、GB2312等都是字符編碼。