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

时间:2016-07-10 13:10:51

标签: javascript xml character-encoding base64 big5

我有一个用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的标准吗?

1 个答案:

答案 0 :(得分:2)

我怀疑问题不是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。