web-dev-qa-db-ja.com

java string.getBytes( "UTF-8")javascriptと同等

私はJavaでこの文字列を持っています:

"test.message"

byte[] bytes = plaintext.getBytes("UTF-8");
//result: [116, 101, 115, 116, 46, 109, 101, 115, 115, 97, 103, 101]

Javascriptで同じことをすると:

    stringToByteArray: function (str) {         
        str = unescape(encodeURIComponent(str));

        var bytes = new Array(str.length);
        for (var i = 0; i < str.length; ++i)
            bytes[i] = str.charCodeAt(i);

        return bytes;
    },

私は得る:

 [7,163,140,72,178,72,244,241,149,43,67,124]

Unescape(encodeURIComponent())が文字列をUTF-8に正しく変換するという印象を受けました。そうではありませんか?

参照:

http://ecmanaut.blogspot.be/2006/07/encoding-decoding-utf8-in-javascript.html

8
Wesley

JavaScriptにはStringの文字エンコードの概念がなく、すべてがUTF-16。ほとんどの場合、UTF-16charの値はUTF-8と一致するため、次のことができます。違いがあることを忘れてください。

これを行うためのより最適な方法がありますが

_function s(x) {return x.charCodeAt(0);}
"test.message".split('').map(s);
// [116, 101, 115, 116, 46, 109, 101, 115, 115, 97, 103, 101]
_

では、unescape(encodeURIComponent(str))は何をしているのでしょうか?それぞれを個別に見てみましょう、

  1. encodeURIComponent は、str内のすべての文字を変換しています。これは、不正であるか、URI構文で意味を持ちますURIエスケープバージョン。これにより、[〜#〜] uri [〜#〜]の検索コンポーネントでキーまたは値として使用しても問題ありません。 、たとえばencodeURIComponent('&='); // "%26%3D"これが6文字の長さStringになっていることに注目してください。
  2. unescape は実際には減価償却されますが、decodeURIまたはdecodeURIComponentencodeURIComponentの逆)と同様の機能を果たします。 ES5仕様 を見ると、11. Let c be the character whose code unit value is the integer represented by the four hexadecimal digits at positions k+2, k+3, k+4, and k+5 within Result(1).がわかります。
    つまり、_4_桁は_2_バイトは "UTF-8"ですが、前述したように、すべて文字列UTF-16なので、実際にはUTF-16文字列であり、UTF-8
8
Paul S.

Encoding Living Standard の一部であるTextEncoderを使用できます。 Chromiumダッシュボードの Encoding API エントリによると、Firefoxで出荷され、Chrome 38で出荷されます。 text-encoding ポリフィルも利用できます。

以下のJavaScriptコードサンプルは、期待する値で満たされたUint8Arrayを返します。

var s = "test.message";
var encoder = new TextEncoder();
encoder.encode(s);
// [116, 101, 115, 116, 46, 109, 101, 115, 115, 97, 103, 101]
9
Kevin Hakanson