博学,切问,近思--詹子知 (http://blog.****.net/zhiqiangzhan)
UTF-8(8 位元 Universal Character Set/Unicode Transformation Format)是一种针对Unicode的可变长度字元编码。
UTF-8 是一种传输编码,他和定长的Unicode编码有如下关系。
UCS (Universal Character Set)
UTF (UCS Transformation Format)
UCS-2字符编码(十六进制数) | UTF-8字节流(二进制数) |
0000-007F | 0xxxxxxx |
0080-07FF | 110xxxxx 10xxxxxx |
0800-FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
因为网络上大量传输的数据都是ASCII字符,比如HTML标记,XML标记等等,所以UTF-8有很高的传输效率,而且又可以兼顾不同地区的语言编码。
下面的代码描述Unicode和UTF-8之间的转换。
public class UTF { private static final int SINGLE = 0x0080; private static final int DOUBLE = 0x0800; public static String unicode2Utf8(char c){ if(c < SINGLE){ return Integer.toHexString(c); }else if(c < DOUBLE){ int a = c & 0x3F; // 111111 a |= 0x80; int b = c & 0x7CF; // 11111 000000 b <<= 2; b |= 0xC0; return Integer.toHexString(b | a); }else{ int a = c & 0x3F; a |= 0x80; int b = c & 0xFC0; b <<= 2; b |= 0x8000; int x = c & 0xF000; x <<= 4; x |= 0xE00000; return Integer.toHexString(a | b | x); } } public static String utf2Unicode(int u){ int len = Integer.toBinaryString(u).length(); if(len < 8){ return Integer.toHexString(u); }else if(len == 16){ int a = u & 0x3F; int b = u & 0x1F00; b >>= 2; return Integer.toHexString(a | b); }else if(len == 24){ int a = u & 0x3F; int b = u & 0x3F00; int c = u & 0x0F0000; b >>= 2; c >>= 4; return Integer.toHexString(a | b | c); } return ""; } }