IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【编码问题】使用 http 请求,中文乱码问题 -> 正文阅读

[网络协议]【编码问题】使用 http 请求,中文乱码问题

使用 http 请求,中文乱码问题

现象

客户端向服务器端发起 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,要解决这个问题,必须要治标还要治本,项目中必须全程保证编码一致性。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 01:01:36  更:2022-09-21 01:03:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:39:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码