You need to enable JavaScript to run this app. Puppeteer爬取的JSON Unicode转义字符转码失效及utf8-to-ansi报错解决
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer爬取的JSON Unicode转义字符转码失效及utf8-to-ansi报错解决

Puppeteer爬取场景下的Unicode转义乱码处理

核心问题现象

  • 爬取获取的文本呈现JSON编码的Unicode转义形式:正常应显示的é被展示为\u00e9、正常应显示的à被展示为\u00e0,必须将这类转义字符转换为对应原生字符才能正常投入使用。
  • 现有处理流程为:读取本地响应文件、转为字符串后执行正则匹配逻辑,处理完成后将内容写入本地文件,现有代码片段如下:
var str = fs.readFileSync('./tmp/response.json');
const matches = str.toString('latin1').matchAll(regexp);
....
fs.writeFileSync('./tmp/bdd.txt', resp, { flag: 'a+' },  'latin1');

已尝试未生效的方案

  • 直接使用JSON.parse做解析:待处理内容不是合法JSON结构,无法完成正常解析流程
  • 手动调用toString('latin1')、toString('utf8')做编码转换:转换前后内容无明显变化,未解决转义字符的识别问题
  • 引入npm模块utf8-to-ansi做字符转换:调用时直接抛出错误TypeError: utf8ToAnsi is not a function,对应测试代码如下:
var utf8ToAnsi = require("utf8-to-ansi")
    const utf8 = 'สวัสดีชาวโลก'
    const ansi = utf8ToAnsi(utf8)
    console.log(ansi)

可落地的解决方法

  • 针对混杂在非合法JSON文本中的\uXXXX格式Unicode转义片段,不需要依赖完整JSON解析流程,可通过全局正则匹配替换完成转换:匹配所有\u开头的4位十六进制片段,通过String.fromCharCode将十六进制编码值转回原生可读字符,核心逻辑示例:
// 匹配所有Unicode转义片段的正则
const unicodeEscapeReg = /\\u([0-9a-fA-F]{4})/g;
// 对原始字符串做替换转换
const convertedStr = rawContent.replace(unicodeEscapeReg, (match, hexStr) => {
  return String.fromCharCode(parseInt(hexStr, 16));
})
  • 修正原有代码的fs接口参数错误:Node.js的fs.writeFileSync接口仅支持3个入参(路径、写入内容、配置项),原代码将flag: 'a+'作为第三个入参、'latin1'作为第四个入参传入,编码配置完全没有生效。正确写法是将编码、追加标记合并到同一个配置对象中,例如:
fs.writeFileSync('./tmp/bdd.txt', resp, {
  flag: 'a+',
  encoding: 'utf8'
});
  • 调整文件读写的编码配置:读取本地响应文件时使用默认的utf8编码即可,不需要手动指定latin1做强制转换;写入目标文件时同步配置utf8编码,避免因编码不匹配导致的字符识别异常。
  • 如果要使用utf8-to-ansi模块,需先核对模块的导出结构:该模块并非直接导出可执行函数,而是以对象结构导出对应方法,不能直接将require的返回值作为函数调用,需要按照模块的导出属性获取对应转换方法后再执行调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 01:45:05