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
相关产品推荐
相关产品推荐

