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

如何在使用Javascript的浏览器中解析非UTF8 XML?,javascript,xml,character-encoding,base64,big5,Javascript,Xml,Character Encoding,Base64,Big5,我有一个用big5编码的XML字符串: atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+') (中文在UTF-8中。) 我想提取的内容。如何在浏览器中使用纯Javascript实现这一点?最好使用没有jquery或emscripten的轻量级解决方案 已尝试DOMParser: (new DOMParser()).parseFromString(atob('PD94bWwgdmV

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

atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+')
中文在UTF-8中。)

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

已尝试
DOMParser

(new DOMParser()).parseFromString(atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+'), 'text/xml')
var decoder = new TextDecoder('big5'); 
var decoded = decoder.decode(bytes);

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

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

您需要使用另一种方法来获取原始字节,例如使用

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

(new DOMParser()).parseFromString(atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+'), 'text/xml')
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;
你可以在



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

这可能是一个愚蠢的问题,暴露了我的无知,但您如何检查编码属性是否不受尊重?另外,在您的真实案例中,字符串是否编码为big5,然后再编码为base64,如您在这里的示例所示?作为未来访问者的参考,真实代码如下:。这是我的项目的一个旧提交,现在使用下面提到的TextEncoder。谢谢。TextEncoder/TextDecoder确实是我后来使用的。atob和DOMParser都有问题。在上的错误报告中,一位Mozilla开发人员确认DOMParser假设所有输入都是UTF-8。事实上,从mozilla central的dom/base/DOMParser.cpp可以很容易地看到parseFromString使用了一种硬编码编码UTF-8。TextDecoder方法需要事先知道编码。虽然不太理想,但对我的项目来说已经足够了。仅供参考,我认为它可以在内部从UTF-16转换为UTF-8。诚然,我不确定这会对你的处境造成什么影响。谢谢你。似乎所有的Javascript字符串都假定为C级的UTF-16?我相信是这样。(虽然说“假定”有点奇怪……它们是UTF-16)。