2

big5 でエンコードされた XML 文字列があります。

atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+')

( <?xml version="1.0" encoding="big5" ?><title>中文</title>UTF-8で。)

の内容を抽出したいと思い<title>ます。ブラウザで純粋なJavascriptを使用するにはどうすればよいですか? jquery や emscripten を使用しない軽量のソリューションを使用することをお勧めします。

試したDOMParser

(new DOMParser()).parseFromString(atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYmlnNSIgPz48dGl0bGU+pKSk5TwvdGl0bGU+'), 'text/xml')

しかし、Chromium も Firefox もエンコーディング属性を尊重しません。DOMParserUTF-8のみをサポートする規格ですか?

4

1 に答える 1

4

問題は ではなくDOMParseratobもともと非 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で確認できます


*理由を理解する 1 つの方法:atob元の文字列のエンコーディングをパラメーターとして使用しないため、base64 でエンコードされたデータをバイトに内部的にデコードする必要がありますが、それらのバイトがどのような文字エンコーディングであるかを仮定する必要があります。文字のJavascript文字列。これは内部的にUTF-16としてエンコードされていると思います。

于 2016-07-20T20:45:56.473 に答える