私は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
JavaScriptにはStringの文字エンコードの概念がなく、すべてがUTF-16。ほとんどの場合、UTF-16のchar
の値は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))
は何をしているのでしょうか?それぞれを個別に見てみましょう、
encodeURIComponent
は、str
内のすべての文字を変換しています。これは、不正であるか、URI構文で意味を持ちますURIエスケープバージョン。これにより、[〜#〜] uri [〜#〜]の検索コンポーネントでキーまたは値として使用しても問題ありません。 、たとえばencodeURIComponent('&='); // "%26%3D"
これが6文字の長さStringになっていることに注目してください。unescape
は実際には減価償却されますが、decodeURI
またはdecodeURIComponent
(encodeURIComponent
の逆)と同様の機能を果たします。 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。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]