You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON文件中UTF-8字节以\u序列存储的解码问题及合法性验证

双重编码JSON的解析问题:原因、修复方案与规范说明

嘿,这个问题我之前也碰到过,本质是双重编码搞的鬼:原本的字符í(Unicode码点U+00ED)先被编码成UTF-8字节\xc3\xad,然后这些字节又被错误地当作独立的Unicode码点,用\uXXXX格式转义了,所以用标准json.load()解析后才会出现乱码HornÃ\xadková。

1. 这是什么编码问题?

这属于UTF-8字节被错误转义为Unicode转义序列的情况,是数据生成时的失误:

  • 第一步:原始Unicode文本(Horníková)被编码成UTF-8字节流;
  • 第二步:本该直接写入这些字节或正确转义原始Unicode字符,结果却把每个UTF-8字节都当成了单独的Unicode码点,用\uXXXX格式转义输出,导致了双重编码。

2. Python 3中正确解析的方法

你可以分两步修复这个乱码:先正常解析JSON,然后把乱码字符串按Latin-1解码回原始UTF-8字节,再重新用UTF-8解码成正确的Unicode文本:

import json

# 先正常读取JSON文件
with open('your_json_file.json', 'r', encoding='utf-8') as f:
    raw_data = json.load(f)

# 修复单个字段的乱码
fixed_sender_name = raw_data['sender_name'].encode('latin-1').decode('utf-8')
raw_data['sender_name'] = fixed_sender_name

print(raw_data['sender_name'])  # 输出:Horníková

为什么用Latin-1?因为Latin-1(ISO-8859-1)的每个码点和字节值是一一对应的,能准确把乱码字符串里的每个字符还原成当初的UTF-8字节,这样就能恢复出正确的UTF-8编码流,再解码成正常文本。

如果你的JSON里有大量这类乱码字段,可以写个递归函数批量修复:

def fix_double_encoded_data(data):
    if isinstance(data, str):
        return data.encode('latin-1').decode('utf-8')
    elif isinstance(data, list):
        return [fix_double_encoded_data(item) for item in data]
    elif isinstance(data, dict):
        return {key: fix_double_encoded_data(value) for key, value in data.items()}
    # 非字符串/列表/字典类型直接返回
    else:
        return data

# 解析后批量修复所有字段
fixed_data = fix_double_encoded_data(raw_data)

3. 这类JSON文件符合规范吗?

完全不符合JSON官方规范。根据RFC 8259(JSON的正式标准),\uXXXX转义序列必须对应一个合法的Unicode码点(4个十六进制字符表示U+0000到U+FFFF范围内的码点)。而这个文件里把UTF-8字节当作码点转义,属于生成JSON时的错误操作——正确的做法应该是直接写入原始Unicode字符,或者对原始Unicode码点进行转义(比如í应该写成\u00ed,而不是\u00c3\u00ad)。

内容的提问来源于stack exchange,提问作者Matej Kormuth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:59:27