integer转char_汉字转UTF-8过程,你知道吗?

本文详细介绍了UTF-8编码的原理,包括变长字节编码方式和编码规则。通过实例展示了如何将汉字如'春'转化为二进制、10进制和16进制,并解释了在URL编码中的应用。通过理解这些转换过程,有助于深入掌握字符编码和数据转换。
摘要由CSDN通过智能技术生成
4f5b3a40363f79ea6831729aad7db6e3.png

什么是UTF-8编码

UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。 如表:


1字节: 0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


因此UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的,位高低顺序也相同。
实际将UNICODE转换为UTF-8编码时应先去除高位0,然后根据所剩编码的位数决定所需最小的UTF-8编码位数。 因此那些基本ASCII字符集中的字符(UNICODE兼容ASCII)只需要一个字节的UTF-8编码(7个二进制位)便可以表示,而对于汉字,则一般需要3个字节表示。

1、取出二进制码

本文以汉字“春”为例进行说明
String str = "春";char[] chars = str.toCharArray();System.out.println(Integer.toString(chars[0], 2));

得到二进制码:

0110011000100101

2、UTF-8的编码规则

规则很简单,只有两条:

1、对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2、对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的UNICODE码。

df4926239d40f174c17c95610e5870fd.png

得到UTF8编码后字节:

11100110  10011000  10100101

3、UTF-8编码字节转成10进制

我们以第一个字节 11100110 为例,其他字节逻辑都是相同的。在这里11100110是以【补码】的形式存在的,那我们想转化成10进制,需要先推算出原码,要想推算出原码,我们得先知道原码转补码的逻辑,然后再逆向推理即可:

原码转补码逻辑:符号位不变,数值位按位取反,末位再加1。

补码转原码的逻辑就是:

符号位不变,末位减1,数值位按位取反。

3115e627f60dc7832178e9d37385a754.png

得出 11100110 的原码 10011010,符号位(最高位)为1,代表负数,数值位转10进制为26,那合起来就是 -26。

4、UTF-8编码字节转成16进制

二进制转16进制就简单许多,只需要从低位起每4位一组分别计算出值即可,仍然以11100110为例:

47d9f7af670e350ad1dbf78715f463b4.png

5、总结

按照上述的方法,汉字“春”最终得出的10进制为:

[-26   -104  -91]

而最终的16进制为:

[E6  98  A5]

汉字转16进制还是用的挺多的,浏览器url编码的时候也是默认转成16进制,只是每个编码结果前增加了%

4f43cc6dd8f39246d5ea8cf62883ce5d.png

同时Java中的URLEncoder.encode方法也是一样:

0f0f3e02f8cda9d04abbb2d0dfc6a3d4.png

编写测试代码:

@Testpublic void testEncode() throws Exception {    String str = "春";    System.out.println(URLEncoder.encode(str, "UTF-8"));}

运行结果:

dbde35e8c42c7e40c39a4b2b6600a80b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值