1. 普通汉字
获取汉字的UTF8编码
public static void main(String[] args) throws Exception {
String str = "金";
byte [] bs = str.getBytes("UTF-16");
System.out.println(bytesToHexFun(bs));
}
public static String bytesToHexFun(byte[] bytes) {
StringBuilder buf = new StringBuilder(bytes.length * 2);
for(byte b : bytes) { // 使用String的format方法进行转换
buf.append(String.format("%02x", new Integer(b & 0xff)));
}
return buf.toString();
}
打印结果:FEFF91D1
把FEFF去掉,剩下的91D1就是UTF8编码了
UTF8编码转汉字
我们用上面的91D1转换文字看看
int utf8 = Integer.parseInt("91D1", 16);
String str = String.valueOf((char) utf8);
System.out.println(str.toString());
打印结果:金
2. 生僻字
获取汉字的UTF8编码
public static void main(String[] args) throws Exception {
String str = "𩇕";
byte [] bs = str.getBytes("UTF-16");
System.out.println(bytesToHexFun(bs));
}
打印结果:FEFFD864DDD5
同前一次一样把FEFF去掉,剩下的D864DDD5就是UTF8编码了。
但是这里需要注意的是,D864DDD5是两个UTF8编码的组合了,D864和DDD5
UTF8编码转汉字
我们用上面获得的生僻字的编码D864和DDD5
int utf8_1 = Integer.parseInt("D864", 16);
int utf8_2 = Integer.parseInt("DDD5", 16);
String str = String.valueOf(new char[] {(char)utf8_1,(char)utf8_2});
System.out.println(str.toString());
打印结果:𩇕
3. 十六进制编码和UTF编码
我在这里获取UTF编码的时候,用的是UTF-16,而不是UTF-8。
byte [] bs = str.getBytes("UTF-16");
UTF-8:获取的是十六进制编码
UTF-16:获取的是UTF编码
获取十六进制编码
public static void main(String[] args) throws Exception {
String str = "金";
byte [] bs = str.getBytes("UTF-8");
System.out.println(bytesToHexFun(bs));
}
打印结果:E98791
这个【E98791】就是【金】的十六进制编码
十六进制转成文字
我偷个懒,也是个实验,在每两个字符中间加一个【%】,这字符串是不是很熟悉?
然后URLDecoder.decode打印出汉字。
System.out.println(URLDecoder.decode("%E9%87%91", "UTF-8"));
System.out.println(URLDecoder.decode("%F0%A9%87%95", "UTF-8"));
打印结果:
金
𩇕
几个字符不同表达方式的比较:
Unicode 代码点 U+ 91D1
U+ 291D5
表示字形 金 𩇕 UTF-32 代码单元
000091D1
000291D5
UTF-16 代码单元
91D1
D864
DDD5
UTF-8 代码单元
E9
87 91
F0
A9 87 95