如何修复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:
- 不直接按UTF-8读文件,先拿原始字节,避免提前解析出错
- 解析JSON结构后,单独处理
filename字段:把乱码的字符串转回字节,再用Latin1解码还原正确内容 - 写入时关闭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
相关产品推荐
相关产品推荐

