我在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
答案 0 :(得分:8)
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 spec,我们可以看到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
个字节是&#34; UTF-8&#34; ,但正如我所提到的,所有字符串都是< em> UTF-16 ,所以它实际上是 UTF-16 字符串,将自己限制为 UTF-8 。答案 1 :(得分:7)
您可以使用TextEncoder
作为Encoding Living Standard的一部分。根据Chromium Dashboard的Encoding API条目,它在Firefox中发布,将在Chrome 38中发布。还有一个text-encoding polyfill可用。
下面的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]