8

Base64 でエンコードされた UTF-16 のデータがあります。データをデコードしようとしていますが、ほとんどのライブラリは UTF-8 しかサポートしていません。null バイトをドロップする必要があると思いますが、どうすればよいかわかりません。

現在、Base64 にDavid Chambbers Polyfillを使用していますが、 phpjs.orgなどの他のライブラリも試しましたが、どれも UTF-16 をサポートしていません。

指摘すべきことの 1 つは、Chrome では atob メソッドが問題なく動作することです。Firefox ではここで説明されている結果が得られ、IE では最初の文字のみが返されます。

どんな助けでも大歓迎です

4

1 に答える 1

25

UTF-8 に変換するのではなく、UTF-16 をデコードしたい。デコードとは、結果が抽象的な文字列であることを意味します。もちろん、文字列の内部エンコーディング、JavaScript の UTF-16 または UCS-2 もありますが、それは実装の詳細です。

文字列の目標は、エンコーディングについて心配する必要はなく、文字を「そのまま」操作することだけです。したがって、入力をまったくデコードする必要のない文字列メソッドを作成できます。もちろん、これが崩壊する多くのエッジケースがあります。

null を削除するだけでは utf-16 をデコードできません。つまり、これは Unicode の最初の 256 コード ポイントでは問題なく機能しますが、Unicode の他の ~110000 文字のいずれかが使用されると、ゴミが発生します。em ダッシュやスマート クォートなどの最も一般的な非 ASCII 文字を使用することさえできません。

また、あなたの例を見ると、UTF-16LEのように見えます。

//Braindead decoder that assumes fully valid input
function decodeUTF16LE( binaryStr ) {
    var cp = [];
    for( var i = 0; i < binaryStr.length; i+=2) {
        cp.push( 
             binaryStr.charCodeAt(i) |
            ( binaryStr.charCodeAt(i+1) << 8 )
        );
    }

    return String.fromCharCode.apply( String, cp );
}

var base64decode = atob; //In chrome and firefox, atob is a native method available for base64 decoding

var base64 = "VABlAHMAdABpAG4AZwA";
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);

これで、スマート クォートを機能させることもできます。

var base64 = "HCBoAGUAbABsAG8AHSA="
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);
//"“hello”"
于 2013-01-30T10:31:41.180 に答える