字符的編碼、傳輸

找了下面幾篇文章,試圖理解一下字符的編碼和傳輸。
http://www.jianshu.com/p/oHryhG
http://visionsky.blog.51cto.com/733317/895928
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

ASCII編碼以及ASCII擴展
計算機內部使用Byte存儲,也就是0x00 - 0xFF,共計256個編碼
ASCII使用0x00 - 0x7F,共計128個編碼,用於英文字母、數字、特殊字符;
其它國家進行了擴展,即ASCII擴展,但存在兩個問題:
1、不通用;
2、不夠用;

漢字編碼
簡體:GB2313 -> GBK,不斷擴展,使用兩個字節固定編碼;
繁體:Big5

Unicode編碼
爲世界上所有的符號都賦予一個唯一的編碼,那麼亂碼問題就會消失。
Unicode使用3個字節進行編碼,編碼範圍:0x00-00-00 - 0x10-FF-FF。
Unicode只是一種編碼方案,其有多種存儲、傳輸方式,也就是實現方式,比如utf8,utf16,utf32等。

Unicode符號範圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

跟據上表,解讀UTF-8編碼非常簡單。如果一個字節的第一位是0,則這個字節單獨就是一個字符;如果第一位是1,則連續有多少個1,就表示當前字符佔用多少個字節。後面每個字節都已10開頭。

一個文件如何知道採用什麼編碼方式?另外對於存儲和傳輸,還涉及大小端問題。
Unicode規範中定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做"零寬度非換行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。這正好是兩個字節,而且FF比FE大1。
如果一個文本文件的頭兩個字節是FE FF,就表示該文件採用大頭方式;如果頭兩個字節是FF FE,就表示該文件採用小頭方式。
BOM = Byte Order Mark,UTF8不存在LE和BE的問題,其BOM可有可無。
編碼方案 BOM(十六進制)
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

Unicode碼的編碼範圍:0x000000 ~ 0x10FFFF,三個字節。
第一個字節代表plane,共計17個plane,每個plane有65536個狀態;
事實上,在Unicode 5.0版本中只用到了0,1,2,14,15,16這幾個編號plane中的238605個狀態。

存儲邏輯
Unicode編碼了世界上所有字符,但佔用空間比較大,其採用編碼和存儲分開的邏輯,就有了多種實現方式。
utf8:變長,1-4字節;
utf16:變長,2,4字節;
utf32:定長,4字節;因爲unicode只有3字節,因此直接存儲。

Unicode、UCS2、UCS4
unicode的前身是UCS ?分爲UCS2和UCS4兩種形式。
Unicode的學名是"UniversalMultiple-Octet Coded Character Set",簡稱爲UCS。UCS可以看作是"Unicode CharacterSet"的縮寫。
爲了使編碼方案統一,UCS4承諾不再向0x10FFFF後面添加新的編碼,並將UCS2作爲0號plane,即BMP(Basic Multilingual Plane)。
3者之間的關係爲:
UCS-4編碼中0x00000000 ~ 0x0010FFFF的部分組成了Unicode編碼
Unicode編碼中0x000000 ~ 0x00FFFF的部分組成了UCS-2編碼
因此UTF-16作爲UCS-2編碼的存儲方案,UTF-32作爲UCS-4編碼的存儲方案使用4個字節,還是仍然保留着。

是否可以這樣認爲?
UCS2 = UTF16, UCS4 = UTF32

內碼
字符必須編碼後才能被計算機處理。計算機使用的缺省編碼方式就是計算機的內碼。
DBCS:雙字節字符集
CJK:中日韓
Unicode只與ASCII兼容,與GB2312,GBK,Big5都不兼容。
Windows使用代碼頁(code page)來適應不同的國家和地區。GBK對應的code page是CP936.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章