如何使用 Javascript 在浏览器中解析非 UTF8 XML?

Chi*_*Yen 4 javascript xml base64 character-encoding big5

我有一个用 big5 编码的 XML 字符串:

\n\n
atob(\'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

<?xml version="1.0" encoding="big5" ?><title>\xe4\xb8\xad\xe6\x96\x87</title> UTF-8 格式。)

\n\n

我想提取内容<title>。如何在浏览器中使用纯 Javascript 来做到这一点?最好有没有 jquery 或 emscripten 的轻量级解决方案。

\n\n

试过DOMParser

\n\n
(new DOMParser()).parseFromString(atob(\'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+\'), \'text/xml\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

但 Chromium 和 Firefox 都不尊重编码属性。这是一个标准吗DOMParser它是仅支持 UTF-8

\n

Mic*_*mza 5

我怀疑问题不是DOMParser,而是atob,它无法正确解码最初的非 ASCII 字符串。*

您将需要使用另一种方法来获取原始字节,例如使用https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js

var encoded = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+';
var bytes = Base64Binary.decode(encoded);
Run Code Online (Sandbox Code Playgroud)

然后使用某种方法将字节转换(即解码 big5 数据)为 Javascript 字符串。对于 Firefox / Chrome,您可以使用TextDecoder

var decoder = new TextDecoder('big5'); 
var decoded = decoder.decode(bytes);
Run Code Online (Sandbox Code Playgroud)

然后传递给DOMParser

var dom = (new DOMParser()).parseFromString(decoded, 'text/xml');
var title = dom.children[0].textContent;
Run Code Online (Sandbox Code Playgroud)

您可以在https://plnkr.co/edit/TBspXlF2vNbNaKq8UxhW?p=preview上看到这一点


*理解原因的一种方法:atob不将原始字符串的编码作为参数,因此虽然它必须在内部将 Base64 编码数据解码为字节,但它必须假设这些字节的字符编码然后给你一个 Javascript 字符串,我相信它内部编码为 UTF-16。