从NodeJS中的iso-8859-1字符集解码XML/HTML实体

czq61nw1  于 2023-01-30  发布在  Node.js
关注(0)|答案(1)|浏览(126)

我正在从一个SOAP操作接收波兰语文本,该操作将波兰语发音符号编码为XML实体,但据我所知,它们不是用UTF-8编码的,而是用ISO-8859 - 1编码的,我正在NodeJS中努力正确地解码它们。
示例文本:Borek FaÅ‚Ä™cki
预期解码结果:Borek Fałęcki
当前结果:Borek FaÅ‚Ä™cki
虽然我在PHP中使用以下代码实现了正确的结果:

echo html_entity_decode('Borek Fałęcki', ENT_QUOTES | ENT_SUBSTITUTE | ENT_XML1, 'ISO-8859-1');

我在NodeJS中做同样的事情时运气不好,没有太多完整的包来帮助解码html/xml实体,我使用了entiteshtml-entities,但它们提供了相同的结果,而且似乎都没有任何字符集设置。

const { decode, encode } = require('html-entities');
const entities = require('entities');

const txt = 'Borek Fałęcki';
console.log('html-entities decode', decode(txt));
console.log('utf8-encoding', encode('Borek Fałęcki', {
    mode: 'nonAsciiPrintable',
    numeric: 'decimal',
    level: 'xml',
}));
console.log('entities decode', entities.decodeXML(txt));

输出:

html-entities decode Borek Fałęcki
utf8-encoding Borek Fałęcki
entities decode Borek Fałęcki

正如我们所看到的,当使用UTF-8编码时,每个字符都有一个实体:

ł = ł
ę = ę

在ISO-8859 - 1中,每个字符有2个实体。我不知道如何获得与PHP相同的解码结果。如果没有实体,我可以将编码转换为UTF-8,但对于实体,我不知道如何正确地进行转换。我无法让对方向我发送UTF-8,因为这是一个封闭的旧协议,我无法控制。

ybzsozfc

ybzsozfc1#

Borek Fałęcki的正确XML编码是Borek Fałęcki。您收到的SOAP操作XML编码错误。
但是,下面的表达式将根据需要对其进行转换:

Buffer.concat(
  "Borek Fałęcki"
  .match(/[^&]+|&#\d+;/g)
  .map(c => c[0] === "&"
    ? Buffer.of(Number(c.substring(2, c.length - 1)))
    : Buffer.from(c))
).toString()

相关问题