为什么我的 JSON 数据显示乱码?关于 Unicode 编码的解决方案

2024-12-01

粘贴接口响应后中文变问号、emoji 成方框?多数时候 JSON 本身没坏,而是读写链路编码不一致。RFC 8259 规定跨系统传输的 JSON 须用 UTF-8;乱码往往出在解码端。

JSON 与 Unicode 的关系

JSON 字符串直接支持 Unicode 字符(如中文、emoji),也支持 \uXXXX 形式的转义。

两种写法等价:"你好" 与 "\u4f60\u597d" 解析后相同。

跨系统传输时 RFC 8259 要求使用 UTF-8;本地文件也建议统一 UTF-8 保存。

{
  "greeting": "你好",
  "escaped": "\u4f60\u597d",
  "emoji": "🎉"
}

常见乱码现象与原因

中文变成 ??? 或 �:读取时用 Latin-1/GBK 解码了 UTF-8 字节。

接口正常但本地文件乱码:编辑器保存编码不是 UTF-8。

数据库里正常、导出后乱码:导出工具未指定 charset=UTF-8。

仅 emoji 异常:部分旧终端字体不支持,与 JSON 本身无关。

\u 转义:何时出现、如何阅读

部分库为 ASCII 安全会输出 \u 转义;解析后仍是正确 Unicode。

若希望在编辑器里直接看到中文,可在合法 JSON 上执行格式化,工具会保留或还原可读字符(取决于源文本)。

手动将乱码转回中文:确认字节序列是否正确,再统一为 UTF-8 解码。

HTTP 与 Content-Type

application/json 媒体类型在 IANA 注册中未定义 charset 参数;实际字节仍应是 UTF-8。

浏览器 response.json() 与 Node fetch 均按 UTF-8 解码 JSON 文本。

若响应头写了错误 charset,部分客户端可能被误导——优先修正服务端。

BOM 与隐藏字符

RFC 8259 禁止在网络传输的 JSON 开头加 BOM;解析器可以忽略 BOM,但不应依赖它。

本地 .json 文件建议保存为 UTF-8 无 BOM;从 Windows 记事本复制时要留意隐藏字符。

排查清单

1. 确认文件或响应实际字节为 UTF-8(hex 编辑器或 file 命令)。

2. 确认编辑器右下角编码为 UTF-8。

3. 用在线工具解析:若工具显示正常,问题在下游消费方。

4. 统一链路:生成 → 传输 → 存储 → 展示 全程 UTF-8。