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

Node.js读取转义Unicode序列文件无法渲染为字符的问题求助

Unicode转义序列渲染问题排查与解决

问题描述

使用Node.js的fs模块读取含转义Unicode序列的文本文件后,控制台输出和HTTP响应里只显示\u5973这类Unicode序列,没法渲染成实际的中文字符;但把相同序列手动赋值给变量时,却能正常显示实际字符。

我尝试的方法

'use strict'
const fs = require('fs')
const app = require('express')();

let data = fs.readFileSync('./unichar.txt')
let str = "\u5973\u88DD\u591Away\u9023\u8EAB\u88D9(\u9577\u8896)"
console.log("from file ========> ",data.toString('utf-8'))
console.log("from str variable >>>>>>>>>> ", str)

let buffer = new Buffer(data,'utf-8')
console.log("After some encoding changes ++++++++> ", buffer.toString('utf8'))

app.get('/',(req,res,next)=>{
    res.contentType('text/plain')
    res.write(data)
    res.write(str)
    res.end()
    next()
})

app.listen(3002)

输出结果

// from console
$ node index.js 
from file ========>  \u5973\u88DD\u591Away\u9023\u8EAB\u88D9(\u9577\u8896)

from str variable >>>>>>>>>>  女裝多way連身裙(長袖)
After some encoding changes ++++++++>  \u5973\u88DD\u591Away\u9023\u8EAB\u88D9(\u9577\u8896)

// from postman
\u5973\u88DD\u591Away\u9023\u8EAB\u88D9(\u9577\u8896)
女裝多way連身裙(長袖)

// from curl
$ curl localhost:3002
\u5973\u88DD\u591Away\u9023\u8EAB\u88D9(\u9577\u8896)
女裝多way連身裙(長袖)

问题原因

  • 手动赋值的字符串里,\uXXXX是JavaScript的转义语法,Node.js在解析代码时会自动把这些序列转换成对应的Unicode字符。
  • 从文件读取的内容是原始文本,其中的\uXXXX只是普通的字符组合(反斜杠+u+四位十六进制数),Node.js不会自动解析这些转义序列,所以直接输出就是原字符串。

解决方案

需要手动解析文件中的Unicode转义序列,转换成实际字符,下面提供两种可行方法:

方法1:借助JSON.parse解析

JSON格式支持Unicode转义序列,我们可以把读取的字符串包裹成合法的JSON字符串,再通过JSON.parse解析:

let fileContent = data.toString('utf-8');
// 先转义原字符串中的双引号,避免JSON解析报错
let escapedContent = fileContent.replace(/"/g, '\\"');
let parsedContent = JSON.parse(`"${escapedContent}"`);

方法2:用正则表达式替换

通过正则匹配所有\uXXXX格式的序列,再转换成对应字符:

let fileContent = data.toString('utf-8');
let parsedContent = fileContent.replace(/\\u([0-9a-fA-F]{4})/g, (match, hex) => {
  return String.fromCharCode(parseInt(hex, 16));
});

修改后的完整代码

'use strict'
const fs = require('fs')
const app = require('express')();

let data = fs.readFileSync('./unichar.txt', 'utf-8');
// 用JSON.parse解析Unicode转义序列
let parsedFileContent = JSON.parse(`"${data.replace(/"/g, '\\"')}"`);
let str = "\u5973\u88DD\u591Away\u9023\u8EAB\u88D9(\u9577\u8896)"

console.log("from file ========> ", parsedFileContent)
console.log("from str variable >>>>>>>>>> ", str)

app.get('/',(req,res,next)=>{
    res.contentType('text/plain; charset=utf-8')
    res.write(parsedFileContent)
    res.write('\n') // 换行区分内容
    res.write(str)
    res.end()
    next()
})

app.listen(3002)

修改后运行代码,控制台和HTTP响应都会正常显示女裝多way連身裙(長袖)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:55:50