【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 110X 10XX 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"就是"嚴"的具體編碼,它的存儲順序與編碼順序是一致的。