Unicode、GBK、UTF-8、ASCII的編碼簡介

mgoann發表於2020-04-06

Unicode、GBK、UTF-8、ASCII的編碼簡介

 

Java當中的編碼,一直對java中的編碼有些模糊,由於現網的一箇中文亂碼的問題,讓我好好將java中的編碼研究了一番,不敢獨享拿出來show一下。

 

都說java中的編碼是Unicode,可以做到平臺無關性,可是做java專案一年多了,根本沒有見過Unicode編碼格式是什麼樣子的,只使用過GBK,UTF-8,GB2312。下面是先來介紹下Unicode編碼。

       Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。Unicode用數字0-0x10FFFF來對映這些字元,最多可以容納1114112(16^4 * 17) 個字元,或者說有1114112個碼位。碼位就是可以分配給字元的數字。UTF-8、UTF-16、UTF-32都是將數字轉換到程式資料的編碼方案。在Unicode中:我們的“我”對應的數字是25105。在Unicode中,我們有很多方式將數字25105表示成程式中的資料,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的縮寫,可以翻譯成Unicode字符集轉換格式,即怎樣將Unicode定義的數字轉換成程式資料。例如,“我們”對應的數字是0x6211和0x4eec。

Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。Unicode用數字0-0x10FFFF來對映這些字元,最多可以容納1114112(16^4 * 17) 個字元,或者說有1114112個碼位。碼位就是可以分配給字元的數字。UTF-8、UTF-16、UTF-32都是將數字轉換到程式資料的編碼方案。在Unicode中:我們的“我”對應的數字是25105。在Unicode中,我們有很多方式將數字25105表示成程式中的資料,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的縮寫,可以翻譯成Unicode字符集轉換格式,即怎樣將Unicode定義的數字轉換成程式資料。例如,“我們”對應的數字是0x6211和0x4eec。

         看過上面的Unicode編碼簡介你應該心裡有數了吧,Unicode其實就是一種規範,規定使用數字來對映字元,例如使用數字25105來對映中文字元”我”。而UTF-8,UTF-16,UTF-32其實是Unicode規範的一種實現方案,這裡主要介紹UTF-8編碼,UTF-8是ASCII的一個超集。因為一個純ASCII字串也是一個合法的UTF-8字串,所以現存的ASCII文字不需要轉換。為傳統的擴充套件ASCII字符集設計的軟體通常可以不經修改或很少修改就能與UTF-8一起使用。UTF-8字符集有廣泛的工具支援,所以UTF-8字符集應用很廣泛,特別是在對XML編碼。

 

         UTF-8的特點是對不同範圍的字元使用不同長度的編碼。對於0x00-0x7F之間的字元,UTF-8編碼與ASCII編碼完全相同。UTF-8編碼的最大長度是4個位元組。從上表可以看出,4位元組模板有21個x,即可以容納21位二進位制數字。Unicode的最大碼位0x10FFFF也只有21位。而漢字0x0800-0xFFFF之間,所有UTF-8使用三個位元組表示漢字。從Unicode到UTF-8的編碼方式如下:

Unicode編碼(16進位制) ║ UTF-8 位元組流(二進位制)

  000000 - 00007F ║ 0xxxxxxx

  000080 - 0007FF ║ 110xxxxx 10xxxxxx

  000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx

  010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

GB2312(1980年)一共收錄了7445個字元,包括6763個漢字和682個其它符號。漢字區的內碼範圍高位元組從B0-F7,低位元組從A1-FE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。

 

GB2312支援的漢字太少。1995年的漢字擴充套件規範GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字元。2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平臺必須支援GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支援GB2312。

 

         從ASCII、GB2312、GBK到GB18030,這些編碼方法是向下相容的,即同一個字元在這些方案中總是有相同的編碼,後面的標準支援更多的字元。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高位元組的最高位不為0。按照程式設計師的稱呼,GB2312、GBK到GB18030都屬於雙位元組字符集 (DBCS)。

 

GBK: 漢字國標擴充套件碼,基本上採用了原來GB2312-80所有的漢字及碼位,並涵蓋了原Unicode中所有的漢字20902,總共收錄了883個符號, 21003個漢字及提供了1894個造字碼位。由於GBK同時也涵蓋了Unicode所有CJK漢字,所以也可以和Unicode做一一對應。

相關文章