java string.getBytes(“UTF-8”)javascript等价物

时间:2014-04-04 11:40:36

标签: java javascript utf-8 byte utf-16

我在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

2 个答案:

答案 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))在做什么?让我们分别看一下,

  1. encodeURIComponent正在将str中非法或 URI语法中含义的每个字符转换为 URI转义版本,以便将它用作 URI 的搜索组件中的键或值是没有问题的,例如encodeURIComponent('&='); // "%26%3D"请注意这是一个6个字符长的 String
  2. unescape实际上是折旧的,但它与decodeURIdecodeURIComponentencodeURIComponent的反面)的工作类似。如果我们查看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]