Unicode、GBK、UTF-8、ASCII的編碼簡介
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做一一對應。
相關文章
- 字元編碼:ASCII,Unicode和UTF-8字元ASCIIUnicode
- 字元編碼筆記:ASCII,Unicode和UTF-8字元筆記ASCIIUnicode
- 字元編碼筆記:ASCII,Unicode 和 UTF-8字元筆記ASCIIUnicode
- 字元編碼 ASCII,Unicode 和 UTF-8 概念掃盲字元ASCIIUnicode
- 字元編解碼的故事(ASCII,ANSI,Unicode,Utf-8區別)字元ASCIIUnicode
- 符號編碼-ASCII、Unicode、Unicode big endian、UTF-8之間的關係(轉)符號ASCIIUnicode
- PHP中文GBK編碼轉UTF-8PHP
- UTF-8編碼與GBK編碼之間的轉換
- ASCII,Unicode,UTF-8,GB2312一些關於編碼的理解ASCIIUnicode
- ASCII編碼的全面介紹ASCII
- 關於字元編碼,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)字元ASCIIUnicode
- 字元編碼:Unicode & UTF-16 & UTF-8字元Unicode
- PHP中文字元gbk編碼與UTF-8編碼的轉換PHP字元
- Unicode編碼介紹Unicode
- Unicode編碼解碼的全面介紹Unicode
- 字符集編碼淺析:Unicode和UTF-8Unicode
- 字元編碼發展史4 — Unicode與UTF-8字元Unicode
- ANSI(字符集) and Unicode(字符集) and UTF-8(編碼Unicode字符集)Unicode
- 帶你瞭解 Unicode和UTF-8編碼知識Unicode
- Unicode中UTF-8與UTF-16編碼詳解Unicode
- 資料庫的編碼淺談(ZHS16GBK與US7ASCII)資料庫ASCII
- Jdk用native2ascii命令做unicode編碼轉換JDKASCIIUnicode
- 一文講透Windows平臺下的ASCII,Unicode編碼問題WindowsASCIIUnicode
- 轉貼 (談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞)&(UTF-8編碼規則)Unicode
- ASCII編碼表ASCII
- unicode,utf-8Unicode
- [Python]Unicode轉ascii碼的一個好方法PythonUnicodeASCII
- WindowsPhone的中文GB2312、GBK編碼與Unicode相互轉換WindowsUnicode
- unicode vs utf-8Unicode
- JS 簡單實現UTF-8編碼,Base64編碼JS
- unicode、utf-8、ansi的故事Unicode
- Unicode編碼解碼Unicode
- java中的編碼簡介Java
- WideCharToMultiByte和MultiByteToWideChar函式的用法(ascii轉unicode unicode轉ascii)IDE函式ASCIIUnicode
- UTF-8 and Unicode FAQ(轉)Unicode
- Unicode,GBK和UTF8Unicode
- 一張圖理清計算機常見編碼的關係。ASCII、Unicode都不是事兒計算機ASCIIUnicode
- unicode和UTF-8的區別Unicode