如何在 Javascript 的浏览器中解析非 UTF8 XML?
How to parse non-UTF8 XML in browsers with Javascript?
我有一个用 big5 编码的 XML 字符串:
atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+')
(UTF-8 中的<?xml version="1.0" encoding="big5" ?><title>中文</title>
。)
我想提取<title>
的内容。我如何在浏览器中使用纯 Javascript 来做到这一点?最好有没有 jquery 或 emscripten 的轻量级解决方案。
尝试过DOMParser
:
(new DOMParser()).parseFromString(atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+'), 'text/xml')
但是 Chromium 和 Firefox 都不尊重编码属性。 DOMParser
只支持 UTF-8 是标准吗?
我怀疑问题不是 DOMParser
,而是 atob
,它无法正确解码最初是非 ascii 字符串的内容。*
您将需要使用另一种方法来获取原始字节,例如使用 https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
var encoded = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+';
var bytes = Base64Binary.decode(encoded);
然后一些方法将字节(即解码 big5 数据)转换为 Javascript 字符串。对于 Firefox / Chrome,您可以使用 TextDecoder
:
var decoder = new TextDecoder('big5');
var decoded = decoder.decode(bytes);
然后传递给DOMParser
var dom = (new DOMParser()).parseFromString(decoded, 'text/xml');
var title = dom.children[0].textContent;
您可以在 https://plnkr.co/edit/TBspXlF2vNbNaKq8UxhW?p=preview
看到这个
*理解原因的一种方式:atob
没有将原始字符串的编码作为参数,因此虽然它必须在内部将base64编码数据解码为字节,但它必须做出假设这些字节是什么字符编码然后给你一个 Javascript 字符串,我相信它在内部编码为 UTF-16。
我有一个用 big5 编码的 XML 字符串:
atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+')
(UTF-8 中的<?xml version="1.0" encoding="big5" ?><title>中文</title>
。)
我想提取<title>
的内容。我如何在浏览器中使用纯 Javascript 来做到这一点?最好有没有 jquery 或 emscripten 的轻量级解决方案。
尝试过DOMParser
:
(new DOMParser()).parseFromString(atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+'), 'text/xml')
但是 Chromium 和 Firefox 都不尊重编码属性。 DOMParser
只支持 UTF-8 是标准吗?
我怀疑问题不是 DOMParser
,而是 atob
,它无法正确解码最初是非 ascii 字符串的内容。*
您将需要使用另一种方法来获取原始字节,例如使用 https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
var encoded = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+';
var bytes = Base64Binary.decode(encoded);
然后一些方法将字节(即解码 big5 数据)转换为 Javascript 字符串。对于 Firefox / Chrome,您可以使用 TextDecoder
:
var decoder = new TextDecoder('big5');
var decoded = decoder.decode(bytes);
然后传递给DOMParser
var dom = (new DOMParser()).parseFromString(decoded, 'text/xml');
var title = dom.children[0].textContent;
您可以在 https://plnkr.co/edit/TBspXlF2vNbNaKq8UxhW?p=preview
看到这个*理解原因的一种方式:atob
没有将原始字符串的编码作为参数,因此虽然它必须在内部将base64编码数据解码为字节,但它必须做出假设这些字节是什么字符编码然后给你一个 Javascript 字符串,我相信它在内部编码为 UTF-16。