近來學習字符編碼,發現網絡上總是把“字符集(Character Set)”與“字符編碼(Encode)”搞混了,我也給弄得暈頭轉向。
其實字符編碼與字符集在本質上就是不同的東西。
字符(Character)>
一個文字就是一個字符。在計算機中,字符是用數字來表示的,不同的文字用不同的數字表示。
字符集(Character Set)
既然是“集”,也就是“集合”,“字符集”自然就是“一定量字符的集合”。
一個字符集包含了固定數量的字符,如ASCII字符集包含A-Z、a-z、0-9、半角標點符號和特殊控制符號(如換行符)在內的128個字符。
字符編碼(Encode)
編碼,意思是指將數據通過一定方式表達或儲存,這個方式就叫編碼。所以字符編碼就是字符的表現、儲存方式,也就是字符集的實現方式。
但需要注意的是:有的字符編碼和字符集的名稱是一致的。
從上可以看出,字符集是字符的集合,字符編碼是把字符集的實現方式。
字符集類型
先看下字符的表達方式。看下錶。
字符編碼 | 每個字符字節數 |
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 |
從上表可以看出,不同的字符編碼用不同的方式表達字符集。
所以,根據所需要的字節數不同,把恆用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)字符集,包含了中、日、韓三國語言中的所有字符。
常見的字符編碼
見表1。
字符集轉換
從一種字符集轉換到另一種字符集,由於某些字符集的並不包含原先字符集中的字符,所以有可能會導致某些字符丟失。
例如GBK轉換成ASCII字符集,就會導致除了單字節字符(ASCII部分)外的所有字符丟失。
注意,計算機上以ASCII方式(其實,ASCII代表了所有的MBCS字符集)儲存文件雖然可以儲存中文,但實質上是因爲GB2312和GBK等字符集是MBCS字符集,所以才歸類到ASCII中,其實本質上還是是GBK字符集而不是ASCII字符集。
字符編碼轉換
由於字符編碼是基於字符集的,所以字符編碼不同也可能導致部分字符丟失。但如果是相同字符集,例如UTF-8(Unicode)到UTF-16(Unicode)編碼,那麼是不會丟失的,因爲它們是同一種字符集的不同表現形式。
因此,希望某些網站、作者、技術人員別把字符集和字符編碼搞混了。否則字符集、字符編碼本身就比較難懂,再搞混了就更難懂了。
FROM :http://fenying.blog.163.com/blog/static/102055993201061211265761/