1

Chrome と IE9 の 2 つのブラウザでjDataViewを使用してバイナリを読み込もうとしています。

ajaxリクエストの前に新しいタイプを追加しましたbinary(jQuery 1.10.0を使用):

// Install binary dataType
jQuery.ajaxSetup({
    accepts: {
        binary: "text/plain; charset=x-user-defined"
    },
    contents: {

    },
    converters: {
        "text binary": true // Nothing to convert
    }
});

バイナリ ストリームを返すサーバー用に、次のヘッダーを追加しました。

<?php header("Content-type: text/html; charset=windows-1251"); ?>

次に、ajax リクエスト:

$.support.cors = true;
$.ajax({
    type: 'GET',
    url: url,
    dataType: 'binary',
    mimeType: 'text/plain; charset=x-user-defined',
    success: function(data) {
        var view = new jDataView(data);
        // ...
    }
});

メソッドgetUint8()を使用して、バイナリ ストリームの一部を取得しています。

for (var l = 0; l < 8; l++) {
    tx += " " + view.getUint8(l, true);
}

tx次に、文字列を比較します。

0 0 0 7 12 106 212 65 (chrome) => GOOD (match the expected results)
0 0 2 94 12 106 36 65 (IE9) => 3 BAD sequences

Chrome では問題なく動作しますが、IE9 では同じ結果にはなりません... Chrome はネイティブgetUint8関数を使用していますが、IE9 は jDataView メソッドを使用しています。

4

1 に答える 1

2

最後に、このハックと jDataView で解決策を見つけました:

var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";

if (oReq.overrideMimeType) {
    oReq.overrideMimeType('text/plain; charset=x-user-defined');
} else {
    oReq.setRequestHeader('Accept-Charset', 'x-user-defined');
}

oReq.onload = function(oEvent) {
    if (oReq.status == 200) {
        var arrayBuffer = oReq.response;
        var view = new Uint8Array(arrayBuffer);
        var dataView = new jDataView(view.buffer);
        // ...
    }
};
于 2013-05-31T16:04:13.463 に答える