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

2022-10-11 21:52:25 132 0
魁首哥

什么是UTF-8 编码

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码。

    得到 UTF8编码 后字节:

     11100110  10011000  10100101  

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

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

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

    补码转原码的 逻辑就是:

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

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

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

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

    5、总结

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

     [-26   -104  -91]  

    而最终的16进制为:

     [E6  98  A5]  

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

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

    编写测试代码:

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

    运行结果:

    收藏
    分享
    海报
    0 条评论
    132
    上一篇:快速上手:Visual Studio Code盘起来 下一篇:PHP单引号和双引号的区别

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码