我正在从一个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实体,我使用了entites
和html-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,因为这是一个封闭的旧协议,我无法控制。
1条答案
按热度按时间ybzsozfc1#
Borek Fałęcki
的正确XML编码是Borek Fałęcki
。您收到的SOAP操作XML编码错误。但是,下面的表达式将根据需要对其进行转换: