Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裏的一項業界標準,包括字符集、編碼方案等。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,以知足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公佈。java
Unicode是國際組織制定的能夠容納世界上全部文字和符號的字符編碼方案。目前的Unicode字符分爲17組編排,0x0000 至 0x10FFFF,每組稱爲平面(Plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。
UTF-8、
UTF-16、
UTF-32都是將數字轉換到程序數據的編碼方案。
通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字符集。UCS-2用兩個字節編碼,UCS-4用4個字節編碼。
UTF-8
UTF-8以字節爲單位對Unicode進行編碼。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼,由Ken Thompson於1992年建立。如今已經標準化爲RFC 3629。UTF-8用1到6個字節編碼Unicode字符。用在網頁上能夠統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
UTF-16
UTF-16是
Unicode字符編碼五層次模型的第三層:字符編碼表(Character Encoding Form,也稱爲 "storage format")的一種實現方式。即把Unicode字符集的抽象碼位映射爲16位長的整數(即
碼元)的序列,用於數據存儲或傳遞。Unicode字符的碼位,須要1個或者2個16位長的碼元來表示,所以這是一個變長表示。
UTF-16是
Unicode的其中一個使用方式。
UTF是 Unicode TransferFormat,即把Unicode轉作某種格式的意思。
它定義於ISO/IEC 10646-1的附錄Q,而
RFC2781也定義了類似的作法。
在Unicode
基本多文種平面定義的
字符(不管是
拉丁字母、漢字或其餘文字或符號),一概使用2
字節儲存。而在輔助平面定義的字符,會以代理對(surrogate pair)的形式,以兩個2字節的值來儲存。
UTF-16比起
UTF-8,好處在於大部分字符都以固定長度的字節 (2字節) 儲存,但UTF-16卻沒法兼容於
ASCII編碼。
UTF-32
UTF-32編碼以32位無符號整數爲單位。Unicode的UTF-32編碼就是其對應的32位無符號整數。
UTF-32 (或 UCS-4)是一種將Unicode
字符編碼的協定,對每個Unicode碼位使用剛好32位元。其它的Unicode transformation formats則使用不定長度編碼。由於UTF-32對每一個
字符都使用4
字節,就空間而言,是很是沒有效率的。特別地,非基本多文種平面的字符在大部分文件中一般很罕見,以至於它們一般被認爲不存在佔用空間大小的討論,使得UTF-32一般會是其它編碼的二到四倍。雖然每個碼位使用固定長定的字節看似方便,它並不如其它Unicode編碼使用得
普遍。
j
java中編碼
String gbkStr = "你好哦!"; //源碼文件是GBK格式,或者這個字符串是從GBK文件中讀取出來的, 轉換爲string 變成unicode格式
//利用getBytes將unicode字符串轉成UTF-8格式的字節數組
byte[] utf8Bytes = gbkStr.getBytes("UTF-8");
//而後用utf-8 對這個字節數組解碼成新的字符串
String utf8Str = new String(utf8Bytes, "UTF-8");
簡化後就是:
unicodeToUtf8 (String s) {
return new String( s.getBytes("utf-8") , "utf-8");
}
UTF-8 轉GBK原理也是同樣
return new String( s.getBytes("GBK") , "GBK");
解決編碼亂碼
java 獲取系統中默認的編碼
System.out.println(System.getProperty("file.encoding"));
System.out.println(Charset.defaultCharset());