网络传输中编码不一致导致的中文乱码问题

现象  

        在测试后端接口时,通过PowerShell的Invoke-RestMethod发送含中文的JSON数据,服务器接收后存储为???,英文可以正常传输

以下为测试请求: 

$body = @{
    title = '新测试标题'
    content = '新的测试内容,确保中文显示正常'
} | ConvertTo-Json -Depth 10
Invoke-RestMethod -Uri 'https://xxx.xxx.xxx./api' 
    -Method Post 
    -Headers @{'Content-Type'='application/json;charset=utf-8'} 
    -Body $body

 

根本原因

        PowerShell默认编码与HTTP标准不匹配:

  •       ConvertTo-Json生成的字符串编码依赖系统默认(如Windows中文系统的GBK),而非UTF-8。
  •                 Invoke-RestMethod直接发送原始编码的字符串,未主动转换为UTF-8字节流。
  •       charset作为编码声明,仅告知服务器如何解码数据,但不改变数据本身的编码格式

   

解决方案

        由上就能知道,造成中文乱码的原因是,发送的数据是以GBK格式的编码传出的,但是声明的编码格式charset却是utf-8,所以数据到达服务器后按照utf-8的格式解码而造成了乱码。

        这也是为什么英文能正常传输但中文却得到‘?’的原因,GBK和UTF-8在编码英文ASCII字符(0x00-0x7F)时是完全一致的,都是单字节编码且字节值相同。但对于非ASCII字符(如中文等),两者的编码方式完全不同。

        所以需要将json字符串强制转换为UTF-8编码的字节流,而避免依赖系统默认的编码格式。

以下为修改后的请求代码:

$body = @{
    title = '新测试标题'
    content = '新的测试内容,确保中文显示正常'
} | ConvertTo-Json -Depth 10

# 强制转换为 UTF-8 字节流再发送
$utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($body)

Invoke-RestMethod -Uri 'https://xxx.xxx.xxx./api' 
    -Method Post 
    -Headers @{'Content-Type'='application/json;charset=utf-8'} 
    -Body $utf8Bytes

总结

        在数据的传输过程中,无论以何种形式编码,都要保证数据的编码格式和解析数据所用的编码一致。

 

参考文章

解决中文乱码问题-CSDN博客

后端常用技能:解决java项目前后端传输数据中文出现乱码、问号问题_java 接收响应是乱码问号怎么解决-CSDN博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值