Python生成的含非ASCII字符JSON文件在JavaScript中解析异常如何解决
问题原因
你使用Python存储JSON文件的逻辑是正确的:指定了UTF-8编码写入,且设置ensure_ascii=False直接将非ASCII字符保存为原生UTF-8字节,没有生成额外的Unicode转义序列。
JS端解析异常的核心原因是读取/获取JSON文件内容的阶段没有使用UTF-8编码正确解码:
- Node.js环境下读取本地文件时如果未指定编码,默认返回Buffer而非UTF-8字符串,错误解码后会导致非ASCII字符显示为Unicode转义码
- 浏览器环境下如果服务器返回的响应头未携带
charset=utf-8标识,浏览器会默认用其他编码解析响应体,也会导致字符解析异常
Python读取正常是因为json.load方法会自动检测文件编码,且多数系统环境下Python打开文件的默认编码就是UTF-8,所以可以正确识别字符。
解决方法
Node.js本地读取场景
读取文件时明确指定utf8编码即可:
const fs = require('fs'); // 读取时指定utf8编码 const mytokenizer = fs.readFileSync('tokenizer.json', 'utf8'); const js = JSON.parse(mytokenizer);
浏览器fetch请求场景
两种方案二选一:
- 服务端配置JSON文件的响应头,添加
Content-Type: application/json; charset=utf-8 - 前端手动用UTF-8解码器解析响应内容:
fetch('tokenizer.json') .then(res => res.arrayBuffer()) .then(buf => { // 手动用UTF-8编码解码二进制内容 const mytokenizer = new TextDecoder('utf-8').decode(buf); const js = JSON.parse(mytokenizer); })
临时兼容方案
如果无法修改读取逻辑,可以手动解析字符串中的Unicode转义序列:
const decodeUnicode = str => str.replace(/\\u([0-9a-fA-F]{4})/g, (_, code) => String.fromCharCode(parseInt(code, 16))); const js = JSON.parse(decodeUnicode(mytokenizer));
内容的提问来源于stack exchange,提问作者OKUU
相关产品推荐
相关产品推荐

