• 【编码问题】使用 http 请求,中文乱码问题


    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

    img

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝

    ✨✨ 欢迎订阅本专栏 ✨✨

    1.中文乱码问题

    客户端向服务器端发起 http 请求的功能,服务器端返回的数据中包含中文,奇怪的是中文个数是偶数个的时候,没有乱码,但是奇数个数时,最后一个汉字会编程问号?

    2.原因

    UTF-8 中,一个汉字 3 个字节,GBK 中一个汉字 2 个字节

    因为 jetty 容器默认是按照系统编码来决定容器编码,前提是没有自己修改启动编码,而公司里我台 PC 是 windows 的,好像默认 GBK 的,反正我对 windows 绯闻也挺多的,于是这里有一个问题,比如 jetty 接受到了一串经过 UTF-8 编码的汉字:

    我很好
    
    • 1

    jetty 收到的最原始的二进制数组是这样的:

      [-26, -120, -111, -27, -66, -120, -27, -91, -67]
    
    • 1

    当然这不是最原始的,最原始的 0 和 1,当然为了好看就算他是最原始的吧,下一步 jetty 要开始编码了,按照 jetty 的 GBK 编码,他按照 2 个字节一个汉字的格式去编码,于是出现了这样的组合:

      [-26, -120]  [ -111, -27]  [-66, -120]  [-27, -91]  [-67]
    
    • 1

    前面每两个字节都能找到对应的汉字,最后 jetty 发现最后居然只有一个字节,找不到对应的汉字,心里想这 SB 是哪来的,于是 jetty 放弃它了,把它赶出去,把 63 丢过去,于是最后的组合成了:

     [-26, -120]  [ -111, -27]  [-66, -120]  [-27, -91]  [63]
    
    • 1

    经过 GBK 的格式编码,两个字节对应一个汉字,就显示出了这样的东西:

     骞茶帿瀛?
    
    • 1

    会出现 5 个,因为每 2 个字节代表一个汉字,最后一个字节是 63,对应的符号是?,就出现了上面的东西,于是我对它做了强制的 UTF-8 编码,导致上面的二进制数组重新组合,经过 UTF-8 的组合之后,二进制数组成了这样:

     [-26, -120, -111] [-27, -66, -120] [-27, -91, 63]
    
    • 1

    再经过 UTF-8 显示之后,变成了这样:

     我很�?
    
    • 1

    前 6 个字节能够正常的显示出汉字,因为那就是真正的数据,然而最后 3 个字节,已经被 GBK 处理了,替换过了,即使使用 UTF-8 也无法还原它原来的容貌,于是它就显示成了上面的样子,但是为什么偶数不会出错?

    因为偶数能够被 GBK 正常的解码,也就是如果汉字是偶数,UTF-8 和 GBK 是等同的,但是如果是奇数,则就出问题了,这也是传说中的最后一个汉字乱码的问题,因为最后一个 字节始终是 63,要解决这个问题,必须要治标还要治本,项目中必须全程保证编码一致性。

    3.解决方案

    项目中必须全程保证编码一致性。

    ❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

    💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

    🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

    img

  • 相关阅读:
    JAVA G1垃圾收集器介绍
    Vue中模板语法与el 和 data 的两种写法
    js循环语句
    Android为什么不能在子线程更新UI
    数仓建设(二)
    Hadoop面试题(2)
    FFmpeg入门详解之11:H264BSAnalyzer简介
    【Python3】【力扣题】338. 比特位计数
    使用qemu运行risc-v ubuntu
    基于Python简单实现接口自动化测试(详解)
  • 原文地址:https://blog.csdn.net/qyj19920704/article/details/126886895