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

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实体。因此解码需反向操作:

  1. 解码XML实体,得到对应ISO-8859-1字节的Unicode字符
  2. 将这些字符转为ISO-8859-1编码的Buffer
  3. 再将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:30:42