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

如何修复JSON文件中的混合字符集并生成纯UTF-8文件?

混合字符集JSON的Python修复方案

问题背景

你的JSON文件因为程序bug出现了字符集混用:

  • title.ger字段是正常UTF-8编码(比如ö对应字节c3 b6)
  • files里的filename字段是Latin1编码(ö对应字节f6),被当成UTF-8解析后显示乱码
  • 用jq处理会直接损坏字符,Python直接序列化会自动转义非ASCII字符,结果不符合要求

解决思路

核心是先拿到原始数据,分别修复不同字段的编码,最后直接输出纯UTF-8、无转义的JSON:

  1. 不直接按UTF-8读文件,先拿原始字节,避免提前解析出错
  2. 解析JSON结构后,单独处理filename字段:把乱码的字符串转回字节,再用Latin1解码还原正确内容
  3. 写入时关闭ASCII转义,直接用UTF-8编码输出

可运行代码

import json

def fix_mixed_charset_json(input_file, output_file):
    # 读取原始字节,避免提前解析编码错误
    with open(input_file, 'rb') as f:
        raw_bytes = f.read()
    
    # 按UTF-8解析JSON结构,用replace忽略解析错误
    data = json.loads(raw_bytes.decode('utf-8', errors='replace'))
    
    # 修复files里的filename字段
    if 'files' in data:
        for item in data['files']:
            if 'filename' in item:
                # 把乱码字符串转成UTF-8字节(还原原始Latin1字节),再用Latin1解码
                raw_filename_bytes = item['filename'].encode('utf-8')
                item['filename'] = raw_filename_bytes.decode('latin-1')
    
    # 写入纯UTF-8、无转义的JSON
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

# 替换成你的输入输出文件路径
fix_mixed_charset_json('problem.json', 'fixed.json')

关键细节

  • 读取用rb模式:直接获取文件原始字节,不会被Python自动转码
  • 解析时用errors='replace':遇到解析错误不会崩溃,用占位符替代不影响后续修复的部分
  • ensure_ascii=False:让JSON序列化时保留非ASCII字符(比如ö),不转成\u00f6这类转义序列
  • 修复filename的逻辑:因为原本是Latin1编码的字节被错误按UTF-8解析成乱码字符串,所以把这个乱码字符串重新编码成UTF-8字节,就得到了原始的Latin1字节,再用Latin1解码就得到正确的文件名

内容的提问来源于stack exchange,提问作者Daniel Alder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:53:31