2011-08-08 1 views
1

XMLHttpRequestを使用してバイナリデータをダウンロードしようとしています。ブラウザでデータが混乱しないようにcharsetを 'x-user-defined'に設定すると、ブラウザはレスポンスの各バイトをUTF-16文字列の下位バイトに設定しません。代わりに、いくつかのバイトの先頭に0xf7が付きます。私は特にAndroid WebViewでこれをやろうとしていますが、Firefoxは同じことをすると思います。charsetを使用しているときに、いくつかのバイトが0xf7で始まるのはなぜですか?x-user-defined with XMLHttpRequest?

どうしてですか?私は欲しいデータを正確に取得していますが、不要な0xf7を取り除くために各バイトに対して&& 0xffを付けなければなりません。

+0

1つのブラウザに限定されているのですか、または複数のブラウザで問題が発生していますか? –

+0

これは標準的な動作です。 – joeforker

答えて

4

は、この溶液をMozilla docsで述べた、と説明がマーカスグラナドから来ている(テキストが使用できなくなりましたが、読んでbackup from web.archive.org):

文字セットのXユーザ定義は、UNICODEのプライベートエリアを使用しています

0xF700 - 0xF7ffを使用して範囲をマップします。

& 0xffを実行すると、高位の位置にあるバイトは単に破棄されます。

+0

ボーナスラウンドでは、なぜISO8859-1は同じことをするのではなく、0x00の上位バイトを使用するのでしょうか?エンコード検出によってオーバーライドされますか? – joeforker

+0

「x-user-defined」文字セットは、未処理のバイナリデータを転送するためのトリックです(「プライベートコードポイントは、割り当てられた文字と見なされますが、Unicode標準によって解釈が指定されていません」)。標準ISO8859-1でバイナリシフトを行うことは期待されていません。 – moraes

+1

"Real" ISO-8859-1はバイトをUnicode U + 0000-U + 00FFにマッピングしますが、レガシーコンテンツとの互換性のために実際にはISO-8859-1はWeb上のwindows-1252のエイリアスです。 [The encoding standard](http://encoding.spec.whatwg.org/#dfnReturnLink-0)を参照してください。 –

3

なぜこのようなことが起こるのかを解説していますが、Firefoxの安定版、サポートされているArrayBuffersなど、現代的(ie IEではなく)のブラウザとしてx-user-definedを使用しないでください。

// after xhr.open() 
xhr.responseType = "arraybuffer"; 

// after xhr load 
var buf = 
     xhr.responseBody   // XHR2 
    || xhr.response    // FF7/Chrome 11-15 
    || xhr.mozResponseArrayBuffer // FF5 
; 
// buf is an ArrayBuffer 

XHRsからブロブとArrayBuffersを取得する方法の例についてはthis gistをチェックアウト:代わりに次のようにしてください。

+0

クールですが、私は携帯電話に乗っていますので、これはまだ私を助けません。 – joeforker

+0

新しい標準が利用できる時はいつも指摘しておきますが、 'x-user-defined'を使ってはいけないと言っています。時々人々はビジネス上の理由でIEをサポートすることを余儀なくされている、彼らは携帯電話上で、または彼らは非常に移植性の高いコードを書くだけです(jQueryはChromeでの作業で有名にならなかった) – stevendesu

関連する問題