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

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请求场景

两种方案二选一:

  1. 服务端配置JSON文件的响应头,添加Content-Type: application/json; charset=utf-8
  2. 前端手动用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:27:02