java中的編碼簡介
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做一一對應。
相關文章
- Java字串編碼介紹Java字串編碼
- Java中Stalactite ORM簡介JavaORM
- 編寫簡單的Java程式碼:HelloWoridJava
- Unicode、GBK、UTF-8、ASCII的編碼簡介UnicodeASCII
- JSON簡介(java中的json庫使用)JSONJava
- 簡單介紹java中的equals()方法Java
- jinq 入門介紹-java中編寫資料庫查詢的簡單自然的方式Java資料庫
- JAVA簡介Java
- 題解1249:簡單編碼 (Java描述)Java
- Java 8中的Base64編碼和解碼Java
- 經緯度編碼方法推薦-pluscode簡介
- Java 11簡介Java
- java JNI簡介Java
- Java 反射簡介Java反射
- Java scirpt簡介Java
- java agent簡介Java
- 第63節:Java中的Spring MVC簡介筆記JavaSpringMVC筆記
- Verilog 編譯指令簡介編譯
- 編譯過程簡介編譯
- Kubernetes – 容器編排簡介
- HTML 編輯器簡介HTML
- 在 Laravel 中編寫簡潔的程式碼的策略Laravel
- ASCII編碼的全面介紹ASCII
- Unicode編碼解碼的全面介紹Unicode
- Java Class物件簡介Java物件
- java編碼Java
- Fedora 中的 Toolbox 簡介
- Unicode編碼介紹Unicode
- Go編譯器簡介【譯】Go編譯
- ARM-GUN彙編簡介
- Linux編輯器Vim簡介Linux
- java註解的簡單介紹Java
- Ansys Student 2020R2中Fluent編譯UDF簡介編譯
- iOS 編寫高質量Objective-C程式碼(一)—— 簡介iOSObjectC程式
- netty系列之:java中的base64編碼器NettyJava
- JAVA阻塞IO(BIO)簡介Java
- Java學習:JDBC簡介JavaJDBC
- Java集合四:Map簡介;Java