NodeJS中解码ISO-8859-1编码XML实体波兰文本的问题
NodeJS 解码基于ISO-8859-1编码的XML实体字符
问题背景
从SOAP接口获取的波兰文本中,变音符号被编码为基于ISO-8859-1的十进制XML实体(例如输入Borek Fałęcki),使用entities或html-entities等常规库解码会得到乱码(Borek Fałęcki),而PHP通过指定字符集参数可正常解码,现需NodeJS下的等效实现。
核心原理
原接口的编码逻辑是:将波兰语变音符号(如ł、ę)先按ISO-8859-1编码为字节序列,再将每个字节单独转为十进制XML实体。因此解码需反向操作:
- 解码XML实体,得到对应ISO-8859-1字节的Unicode字符
- 将这些字符转为ISO-8859-1编码的Buffer
- 再将Buffer转成UTF-8字符串
解决方案代码
方案1:使用第三方实体库(推荐)
借助entities库完成实体解码,再手动处理字符集转换:
const { decodeXML } = require('entities'); function decodeIso88591Entities(text) { // 解码XML实体,得到对应ISO-8859-1字节的Unicode字符 const decodedChars = decodeXML(text); // 转换为ISO-8859-1 Buffer,再转UTF-8字符串 return Buffer.from(decodedChars, 'latin1').toString('utf8'); } // 测试 const input = 'Borek Fałęcki'; console.log(decodeIso88591Entities(input)); // 输出:Borek Fałęcki
方案2:不依赖第三方库
手动正则匹配并解码实体,再处理字符集:
function decodeIso88591Entities(text) { // 匹配所有十进制XML实体,替换为对应字符 const decodedChars = text.replace(/&#(\d+);/g, (_, numStr) => { const num = parseInt(numStr, 10); return String.fromCharCode(num); }); // 转换字符集得到最终结果 return Buffer.from(decodedChars, 'latin1').toString('utf8'); } // 测试 const input = 'Borek Fałęcki'; console.log(decodeIso88591Entities(input)); // 输出:Borek Fałęcki
说明
PHP的html_entity_decode支持直接指定字符集参数,内部自动完成“实体解码→字符集转换”的流程;而NodeJS的主流实体库默认仅按UTF-8逻辑处理,因此需要手动拆分这两步来模拟PHP的处理逻辑。
内容的提问来源于stack exchange,提问作者veodko
相关产品推荐
相关产品推荐

