💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝
✨✨ 欢迎订阅本专栏 ✨✨
客户端向服务器端发起 http 请求的功能,服务器端返回的数据中包含中文,奇怪的是中文个数是偶数个的时候,没有乱码,但是奇数个数时,最后一个汉字会编程问号?
UTF-8 中,一个汉字 3 个字节,GBK 中一个汉字 2 个字节
因为 jetty 容器默认是按照系统编码来决定容器编码,前提是没有自己修改启动编码,而公司里我台 PC 是 windows 的,好像默认 GBK 的,反正我对 windows 绯闻也挺多的,于是这里有一个问题,比如 jetty 接受到了一串经过 UTF-8 编码的汉字:
我很好
jetty 收到的最原始的二进制数组是这样的:
[-26, -120, -111, -27, -66, -120, -27, -91, -67]
当然这不是最原始的,最原始的 0 和 1,当然为了好看就算他是最原始的吧,下一步 jetty 要开始编码了,按照 jetty 的 GBK 编码,他按照 2 个字节一个汉字的格式去编码,于是出现了这样的组合:
[-26, -120] [ -111, -27] [-66, -120] [-27, -91] [-67]
前面每两个字节都能找到对应的汉字,最后 jetty 发现最后居然只有一个字节,找不到对应的汉字,心里想这 SB 是哪来的,于是 jetty 放弃它了,把它赶出去,把 63 丢过去,于是最后的组合成了:
[-26, -120] [ -111, -27] [-66, -120] [-27, -91] [63]
经过 GBK 的格式编码,两个字节对应一个汉字,就显示出了这样的东西:
骞茶帿瀛?
会出现 5 个,因为每 2 个字节代表一个汉字,最后一个字节是 63,对应的符号是?,就出现了上面的东西,于是我对它做了强制的 UTF-8 编码,导致上面的二进制数组重新组合,经过 UTF-8 的组合之后,二进制数组成了这样:
[-26, -120, -111] [-27, -66, -120] [-27, -91, 63]
再经过 UTF-8 显示之后,变成了这样:
我很�?
前 6 个字节能够正常的显示出汉字,因为那就是真正的数据,然而最后 3 个字节,已经被 GBK 处理了,替换过了,即使使用 UTF-8 也无法还原它原来的容貌,于是它就显示成了上面的样子,但是为什么偶数不会出错?
因为偶数能够被 GBK 正常的解码,也就是如果汉字是偶数,UTF-8 和 GBK 是等同的,但是如果是奇数,则就出问题了,这也是传说中的最后一个汉字乱码的问题,因为最后一个 字节始终是 63,要解决这个问题,必须要治标还要治本,项目中必须全程保证编码一致性。
项目中必须全程保证编码一致性。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙