字符串的編碼格式:
String hex="\u5df2\u5b9e\u540d\u5236";// 十六進制
String dec = "全球通";//十進制
String s="已實名制";//字符串
相互轉換的代碼
1.十進制轉unicode編碼
public static String decToHex(String s){ String[] ds=s.split(";"); StringBuffer sbf=new StringBuffer(); for(int i=0;i<ds.length;i++){ if(ds[i].startsWith("&#")){ Integer tem=Integer.parseInt(ds[i].replace("&#", "")); sbf.append("\\u").append(Integer.toHexString(tem)); } } return sbf.toString(); }
2.unicode轉char數組
/** * unicode 轉字符數組 */ public static char[] unicode2Chars(String unicode) { StringBuffer string = new StringBuffer(); String[] hex = unicode.split("\\\\u"); char[] cs=new char[hex.length]; for (int i = 1; i < hex.length; i++) { // 轉換出每一個代碼點 int data = Integer.parseInt(hex[i], 16); cs[i]=(char) data; } return cs; }
3.漢字轉unicode
/** * * @param 漢字 * @return unicode編碼 */ public static String toUnicode(String s) { String as[] = new String[s.length()]; String s1 = ""; for (int i = 0; i < s.length(); i++) { as[i] = Integer.toHexString(s.charAt(i) & 0xffff); s1 = s1 + "\\u" + as[i]; } return s1; }
utf-8
utf-8格式的中文由三位字節組成。
UTF-8的編碼規則很簡單,只有二條:
1)對於單字節的符號,字節的第一位設為0,后面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
2)對於n字節的符號(n>1),第一個字節的前n位都設為1,第n+1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。
下表總結了編碼規則,字母x表示可用編碼的位。
Unicode符號范圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1.中文轉unicode
public static String toUnicode(String s) { String as[] = new String[s.length()]; String s1 = ""; for (int i = 0; i < s.length(); i++) { as[i] = Integer.toHexString(s.charAt(i) & 0xffff); s1 = s1 + "\\u" + as[i]; } return s1; }
2.中文轉bytes
byte[] b=s.getBytes("utf-8");
3. unicode轉utf-8
/* * unicode轉到utf-8的轉換過程。 * @param 要進行轉換的漢字 * @return 16進制表示的漢字UTF-8編碼字節序列 / */ public static String unicode2utf8(char input){ //1 Byte=8byte 16位取值范圍00~ff //input 兩個字節 16位取值范圍為4E00~9FA5 int lowByte = input & 0x00ff; int highByte = (input & 0xff00) >>> 8; // UTF-8的第1個字節是1110 + highByte高4位 int high4inHighByte = (highByte& 0xf0) >>> 4; int utf8Byte1 = (7 << 5) + high4inHighByte; // UTF-8的第2個字節是10 + highByte低4位 + lowByte高2位 int low4inHighByte = highByte & 0x0f; int high2inLowByte = (lowByte& 0xc0) >>> 6; int utf8Byte2 = (1 << 7) + (low4inHighByte << 2) + high2inLowByte; // UTF-8的第3個字節是10 + lowByte低6位 int utf8Byte3 = (1 << 7) + (lowByte & 0x3f); String result = Integer.toHexString(utf8Byte1) + "," + Integer.toHexString(utf8Byte2) + "," + Integer.toHexString(utf8Byte3); return result; }
gbk
GBK編碼,是對GB2312編碼的擴展,因此完全兼容GB2312-80標准。GBK編碼依然采用雙字節編碼方案,其編碼范圍:8140-FEFE,剔除xx7F碼位,共23940個碼位。共收錄漢字和圖形符號21886個,其中漢字(包括部首和構件)21003個,圖形符號883個。GBK編碼支持國際標准ISO/IEC10646-1和國家標准GB13000-1中的全部中日韓漢字,並包含了BIG5編碼中的所有漢字。GBK編碼方案於1995年12月15日正式發布,這一版的GBK規范為1.0版。
GBK 亦采用雙字節表示,總體編碼范圍為 8140-FEFE,首字節在 81-FE 之間,尾字節在 40-FE 之間,剔除 xx7F 一條線。總計 23940 個碼位,共收入 21886 個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號 883 個。
全部編碼分為三大部分:
1. 漢字區。包括:
a. GB 2312 漢字區。即 GBK/2: B0A1-F7FE。收錄 GB 2312 漢字 6763 個,按原順序排列。
b. GB 13000.1 擴充漢字區。包括:
(1) GBK/3: 8140-A0FE。收錄 GB 13000.1 中的 CJK 漢字 6080 個。
(2) GBK/4: AA40-FEA0。收錄 CJK 漢字和增補的漢字 8160 個。CJK 漢字在前,按 UCS 代碼大小排列;增補的漢字(包括部首和構件)在后,按《康熙字典》的頁碼/字位排列。
(3) 漢字“〇”安排在圖形符號區GBK/5:A996。
2. 圖形符號區。包括:
a. GB 2312 非漢字符號區。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符號外,還有 10 個小寫羅馬數字和 GB 12345 增補的符號。計符號 717 個。
b. GB 13000.1 擴充非漢字區。即 GBK/5: A840-A9A0。BIG-5 非漢字符號、結構符和“〇”排列在此區。計符號 166 個。
3. 用戶自定義區:分為(1)(2)(3)三個小區。
(1) AAA1-AFFE,碼位 564 個。
(2) F8A1-FEFE,碼位 658 個。
(3) A140-A7A0,碼位 672 個。
第(3)區盡管對用戶開放,但限制使用,因為不排除未來在此區域增補新字符的可能性。
舉例:
String s="中文"; byte[] b=s.getBytes("gbk");
bytes為
[-42, -48, -50, -60]
補碼為:
【214,208,206,196】
轉換為十六進展為
【D6,D0,CE,C4】
按照gbk表去查詢漢字
編碼完全匹配。