各種編碼之間的區別 用法 總結
阿新 • • 發佈:2019-01-05
1. ASCII和Ansi編碼
字元內碼(charcter code)指的是用來代表字元的內碼.讀者在輸入和儲存文件時都要使用內碼,內碼分為
單位元組內碼 -- Single-Byte character sets (SBCS),可以支援256個字元編碼.
雙位元組內碼 -- Double-Byte character sets)(DBCS),可以支援65000個字元編碼.
前者即為ASCII編碼,後者對應ANSI.
至於簡體中文編碼GB2312,實際上它是ANSI的一個內碼表936
2. Unicode
如上,ANSI有很多內碼表,使用不同內碼表的內碼無法在其他程式碼也正常顯示,這就是為什麼日文版/繁體中文版遊戲無法在簡體中文平臺直接顯示的原因.
Unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案.它是一種2位元組編碼,能夠提供65536個字元,這個數字是不夠表示所有的字元的(漢語就有55000多字元),所以,通過一個代理對的機制來實現附加的917,476個字元表示,以達到所有字元都具有唯一編碼.
3.Unicode和BigEndianUnicode
這兩者只是儲存順序不同,如"A"的unicode編碼為65 00
其BigEndianUnicode編碼為00 65
4. UTF-8
這是為傳輸而設計的編碼,其系列還有UTF-7和UTF-16
其中UTF-16和Unicode編碼大致一樣, UTF-8就是以8位為單元對Unicode進行編碼。從Unicode到UTF-8的編碼方式如下:
Unicode編碼(16進位制) UTF-8 位元組流(二進位制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如“漢”字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3位元組模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進位制是:0110 110001 001001, 用這個位元流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
2、Unicode、UCS和UTF
前面提到從ASCII、GB2312、GBK到GB18030的編碼方法是向下相容的。而Unicode只與ASCII相容(更準確地說,是與ISO-8859-1相容),與GB碼不相容。例如“漢”字的Unicode編碼是6C49,而GB碼是BABA。
Unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。Unicode的學名是"Universal
Multiple-Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode
Character Set"的縮寫。
3、UCS-2、UCS-4、BMP
UCS有兩種格式:UCS-2和UCS-4。顧名思義,UCS-2就是用兩個位元組編碼,UCS-4就是用4個位元組(實際上只用了31位,最高位必須為0)編碼。下面讓我們做一些簡單的數學遊戲:
UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。
UCS-4根據最高位為0的最高位元組分成2^7=128個group。每個group再根據次高位元組分為256個plane。每個plane根據第3個位元組分為256行
(rows),每行包含256個cells。當然同一行的cells只是最後一個位元組不同,其餘都相同。
group 0的plane 0被稱作Basic Multilingual Plane,
即BMP。或者說UCS-4中,高兩個位元組為0的碼位被稱作BMP。
將UCS-4的BMP去掉前面的兩個零位元組就得到了UCS-2。在UCS-2的兩個位元組前加上兩個零位元組,就得到了UCS-4的BMP。而目前的UCS-4規範中還沒有任何字元被分配在BMP之外。
4、UTF編碼
UTF-8就是以8位為單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式如下:
UCS-2編碼(16進位制) UTF-8 位元組流(二進位制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx