java編碼-Unicode


【Unicode介紹】
百度百科:Unicode(統一碼、萬國碼、單一碼)是計算機科學領域里的一項業界標准,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求,並且兼容ISO-8859-1。

一個字符的Unicode編碼是確定的,但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對Unicode編碼的實現方式有所不同。Unicode的實現方式稱為Unicode轉換格式(Unicode Transformation Format,簡稱為UTF)

Unicode是字符集,它主要有UTF-8、UTF-16、UTF-32三種實現方式。由於UTF-8是目前主流的實現方式。

UCS(Universal Character Set,通用字符集),是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標准所定義的標准字符集。它包括了其他所有字符集,保證了與其他字符集的雙向兼容,即,如果你將任何文本字符串翻譯到UCS格式,然后再翻譯回原編碼,你不會丟失任何信息。

UCS不僅給每個字符分配一個代碼,而且賦予了一個正式的名字。表示一個UCS或Unicode值的十六進制數通常在前面加上“U+”,例如“U+0041”代表字符“A”。

Java的class文件采用utf8的編碼方式,Java的字符串是unicode編碼的

UTF-8

UTF-8是一種針對Unicode的可變長度字符編碼,可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。它可以用來表示Unicode標准中的任何字符,且其編碼中的第一個字節仍與ASCII兼容,這使得原來處理ASCII字符的系統無須或只須做少部份修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他存儲或傳送文字的應用中,優先采用的編碼。

UTF-8使用一到四個字節為每個字符編碼,編碼規則如下:

1)對於單字節的符號,字節的第一位設為0,后面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。

2)對於n字節的符號(n>1),第一個字節的前n位都設為1,第n+1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。

轉換表如下:

Unicode

UTF-8

0000 0000 —— 0000 007F

0XXX XXXX

0000 0080 —— 0000 07FF

110X XXXX 10XX XXXX

0000 0800 —— 0000 FFFF

1110XXXX 10XX XXXX 10XX XXXX

0001 0000 —— 001F FFFF

1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX

0020 0000 —— 03FF FFFF

1111 10XX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX

0400 0000 —— 7FFF FFFF

1111 11010XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX

根據上面的轉換表,理解UTF-8的轉換編碼規則就變得非常簡單了:第一個字節的第一位如果為0,則表示這個字節單獨就是一個字符;如果為1,連續多少個1就表示該字符占有多少個字節。

以漢字"嚴"為例,演示如何實現UTF-8編碼[3]

已知"嚴"的unicode是4E25(100 1110 0010 0101),根據上表,可以發現4E25處在第三行的范圍內(0000 0800-0000 FFFF),因此"嚴"的UTF-8編碼需要三個字節,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,從"嚴"的最后一個二進制位開始,依次從后向前填入格式中的x,多出的位補0。這樣就得到了,"嚴"的UTF-8編碼是"11100100 10111000 10100101",轉換成十六進制就是E4B8A5。

ANSI:記事本的默認的編碼方式,對於英文文件是ASCII編碼,對於簡體中文文件是GB2312編碼。注意:不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中

Unicode:UCS-2編碼方式,即直接用兩個字節存入字符的Unicode碼。該方式是倒序方式存取,該方式是"小頭"little endian。

Unicode big endian:UCS-2編碼方式,順序方式存取,即 "大頭"方式。

 

在EditPlus輸入"嚴"字,依次選擇ANSI、Unicode、Unicode big endian、UTF-8四種編碼風格,然后另存,使用Hex Viewer工具進行查看:

 

ANSI:兩個字節"D1 CF"正是"嚴"的GB2312編碼。

Unicode:四個字節"FF FE 25 4E",其中"FF FE"表示小頭(倒序)存儲方式,真正的編碼為"4E 25"。

Unicode big endian:四個字節"FE FF 4E 25","FE FF"表示大頭(順序)存儲方式,真正編碼為"4E 25"。

UTF-8:編碼是六個字節"EF BB BF E4 B8 A5",前三個字節"EF BB BF"表示這是UTF-8編碼,后三個"E4B8A5"就是"嚴"的具體編碼,它的存儲順序與編碼順序是一致的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM