现象
在测试后端接口时,通过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
总结
在数据的传输过程中,无论以何种形式编码,都要保证数据的编码格式和解析数据所用的编码一致。
参考文章
后端常用技能:解决java项目前后端传输数据中文出现乱码、问号问题_java 接收响应是乱码问号怎么解决-CSDN博客