汉字与UTF编码的互相转换(Java)

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+91D1U+291D5
表示字形𩇕
UTF-32 代码单元
000091D1
000291D5
UTF-16 代码单元
91D1
D864DDD5
UTF-8 代码单元
E98791
F0A98795
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值