1. 程式人生 > >各種編碼之間的區別 用法 總結

各種編碼之間的區別 用法 總結

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