ASCII、unicode、utf

機器只認識10,因此人爲了能用本身的語言與機器交互,規定出了各類二進制與語言字符的對應關係,即編碼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

UTF

unicode在實際應用中是有問題的,好比對於多字節字符,如何讓機器知道這是一個字符而不是多個字符,因此在與機器實際交互中,須要將unicode轉換格式後使用,這就出現了UTF(UTF,是UnicodeTransformationFormat的縮寫,意爲Unicode轉換格式),包括utf-3二、utf-1六、utf-8等等。代理

utf-32

規則:每一個碼點使用四個字節表示,字節內容一一對應unicode碼點code

unicode 中 'a'爲 u+61
utf-32轉化後爲 00000061
複製代碼

缺點:浪費空間。若是一個全是英文的文件,每一個字符都會浪費三個字節的空間,由於每一個英文字符一個字節就能夠表示。orm

utf-16

規則: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

規則:utf-8

  1. 對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的 Unicode 碼。所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。
  2. 對於n字節的符號(n > 1),第一個字節的前n位都設爲1,第n + 1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。
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
相關文章
相關標籤/搜索