機器只認識1
和0
,因此人爲了能用本身的語言與機器交互,規定出了各類二進制與語言字符的對應關係,即編碼。javascript
ASCII
編碼最先普及的編碼集爲ASCII
碼,它用一個字節(8位二進制)規定了128個字符的編碼(首位二進制統一爲0,2^7個),主要都是英文字符。java
ASCII
編碼英語使用ASCII
中規定的128個字符就足夠了,可是卻遠遠不足以表示其餘語言,即便是利用上首位的二進制,因而出現了各國語言的編碼,好比支持簡體中文的GB2312
,支持繁體中文的BIG5
。使得在解析文件時還須要注意它的編碼格式,不然就會亂碼,由於不一樣的編碼對二進制會有不一樣的解讀。編碼
語言 | 字符集 | 正式名稱 |
---|---|---|
英語、西歐語 | ASCII,ISO-8859-1 | MBCS 多字節 |
簡體中文 | GB2312 | MBCS 多字節 |
繁體中文 | BIG5 | MBCS 多字節 |
簡繁中文 | GBK | MBCS 多字節 |
中文、日文及朝鮮語 | GB18030 | MBCS 多字節 |
各國語言 | unicode,UCS | DBCS 寬字節 |
unicode
碼在這種背景下誕生了,它統一了全世界的語言符號。使用U+****
表示,*
爲16進制數.spa
- Unicode不是一次性定義的,而是分區定義。每一個區能夠存放65536個(2^16 )字符,稱爲一個平面(plane)。目前,一共有17個(2^5 )平面,也就是說,整個Unicode字符集的大小如今是2^21。
- 最前面的65536個字符位,稱爲基本平面(BMP),它的碼點範圍是從0 ~ 2^16-1,寫成16進制就是
U+0000 ~ U+FFFF
。全部最多見的字符都放在這個平面,這是Unicode最早定義和公佈的一個平面。- 剩下的字符都放在輔助平面(縮寫SMP),碼點範圍從
U+010000 ~ U+10FFFF
unicode
在實際應用中是有問題的,好比對於多字節字符,如何讓機器知道這是一個字符而不是多個字符,因此在與機器實際交互中,須要將unicode轉換格式後使用,這就出現了UTF(UTF,是UnicodeTransformationFormat的縮寫,意爲Unicode轉換格式),包括utf-3二、utf-1六、utf-8等等。代理
規則:每一個碼點使用四個字節表示,字節內容一一對應unicode
碼點code
unicode 中 'a'爲 u+61
utf-32轉化後爲 00000061
複製代碼
缺點:浪費空間。若是一個全是英文的文件,每一個字符都會浪費三個字節的空間,由於每一個英文字符一個字節就能夠表示。orm
規則:ip
Unicode範圍 | UTF-16編碼方式 |
---|---|
U+000~U+FFFF | 2 字節存儲,編碼後等於Unicode值 |
U+10000~U+10FFFF | 4 字節存儲。**1.**將Unicode值減去(0x10000),獲得20bit長的值。再將Unicode分爲高10位和低10位。 UTF-16編碼的高位是2 Byte,高10位Unicode範圍爲0-0x3FF,將Unicode值加上0XD800,獲得高位代理(或稱爲前導代理,存儲高位);低位也是2 Byte,低十位Unicode範圍同樣爲0~0x3FF,將Unicode值加上0xDC00,獲得低位代理(或稱爲後尾代理,存儲低位) |
規則:utf-8
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 |