天天看點

ANSI, UTF-8, Unicode, GBK, GB2312 字元編碼小結

這兩天碰見一個Bug,涉及到字元編碼,索性研究了下,整理出來,以便今後查閱。

ASCII碼,0~127,128個,這個就不用多說了,他是計算機文明的基石。但是這裡面隻有英文字母,其他國家如何把本國的文字輸入到電腦中呢?是以基本每種語言都有自己的字元集,如漢字就有GB2312(簡體中文),BIG5(繁體中文)等等。

但不同的ANSI編碼在不同語言之間是不相容的,是以對于不同的作業系統之間檔案的傳輸,或者在同樣的作業系統下,源檔案語言不同于OS的語言檔案的傳輸,需要轉換成UT8格式。

如何轉換呢?

GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能互相轉換:

GBK、GB2312 -->  Unicode  -->  UTF-8 

UTF-8               -->  Unicode   -->  GBK、GB2312

具體差別:

ANSI: 16384個字元。這就是ANSI字元标準。英文一個位元組,中文兩個位元組。中文的網頁和作業系統中通常采用ANSI編碼,這也是微軟OS的一個字元标準。對于ANSI,不同的國家和地區制定了不同的标準,由此産生了GB2312(簡體中文),BIG5(繁體中文),JIS(日文)等各自的編碼标準。但不同的ANSI編碼在不同語言之間是不相容的,是以對于不同的作業系統之間檔案的傳輸,或者在同樣的作業系統下,源檔案語言不同于OS的語言檔案的傳輸,需要轉換成UT8格式。

UNICODE:使用兩個位元組對世界上幾乎所有的語言進行編碼(0x0000-0xFFFF),65536個字元,每種語言的代碼段不同,兩個位元組(英文、中文都是兩個位元組)所表達的字元是唯一的,是以不同語種可以共存于文本中,解決國際化的問題。

UTF-8: 是Unicode一種壓縮形式,英文A在Unicode中表示為0x0041,老外覺得這種存儲方式太浪費,因為浪費了50%的空間,于是就把英文壓縮成1個位元組,成了UTF-8編碼,但是漢字在UTF-8中占3個位元組,顯然用做中文不如ANSI合算,這就是中國的網頁用作ANSI編碼而老外的網頁常用UTF-8的原因。

特别提下 Unicode 和 UTF-8 差別

Unicode字元集,它固定使用16bits(兩個位元組)來表示一個字元,共可以表示65536個字元, 标準的Unicode稱為UTF-16(UTF: UCS Transformation Format )。

後來為了雙位元組的Unicode能夠在現存的處理單位元組的系統上正确傳輸,出現了UTF-8,使用類似MBCS的方式對Unicode進行編碼。畢竟網際網路70%以上的資訊仍然是英文。如果連英文都用2個位元組存取(UCS-2),空間浪費不就太多了?

所謂UTF-8就是這樣一個為了提高英文存取效率的字元集轉換格式:Unicode Transformation Form 8-bit form。用UTF-8,UNICODE的2位元組字元用變長個(1-3個位元組)表示:

對英文,仍然和ASCII一樣用1個位元組表示,這個位元組的值小于128(/x80);

對其他語言的用一個值位于128-256之間的位元組開始,再加後面緊跟的2個位元組表示,一個字元一共是3個位元組;

UTF-8編碼字元理論上可以最多到 6 個位元組長, 然而 16 位 BMP 字元最多隻用到 3 位元組長。

Bigendian UCS-4 位元組串的排列順序是預定的。

位元組 0xFE 和 0xFF 在 UTF-8 編碼中從未用到。

下列位元組串用來表示一個字元。用到哪個串取決于該字元在 Unicode 中的序号.

U-00000000 - U-0000007F:  0xxxxxxx 

U-00000080 - U-000007FF:  110xxxxx10xxxxxx 

U-00000800 - U-0000FFFF:  1110xxxx10xxxxxx 10xxxxxx 

U-00010000 - U-001FFFFF:  11110xxx10xxxxxx 10xxxxxx 10xxxxxx 

U-00200000 - U-03FFFFFF:  111110xx10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

U-04000000 - U-7FFFFFFF:  1111110x10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  

xxx 的位置由字元編碼數的二進制表示的位填入。越靠右的 x 具有越少的特殊意義。隻用最短的那個足夠表達一個字元編碼數的多位元組串。注意在多位元組串中, 第一個位元組的開頭"1"的數目就是整個串中位元組的數目.

例如: Unicode 字元 U+00A9 = 1010 1001 (版權符号) 在 UTF-8 裡的編碼為:

11000010 10101001 = 0xC2 0xA9

而字元 U+2260 = 0010 0010 0110 0000 (不等于) 編碼為:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

這種編碼的官方名字拼寫為 UTF-8, 其中 UTF 代表 UCS Transformation Format。

繼續閱讀