java string.getBytes(“UTF-8”) javascript equivalent

2022-09-04 07:22:09

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


答案 1

您可以使用编码生活标准的一部分。根据Chromium Dashboard的编码API条目,它在Firefox中发布,并将在Chrome 38中发布。还有一个文本编码的polyfill可用。TextEncoder

下面的 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]

答案 2

JavaScript没有字符串的字符编码概念,一切都是UTF-16。大多数时候,UTF-16 中的 a 值与 UTF-8 匹配,因此您可以忘记它有任何不同。char

有更理想的方法可以做到这一点,但是

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 正在将每个非法字符或在 URI 语法中具有含义的字符转换为 URI 转义版本,以便将其用作 URI 搜索组件中的键或值不会出现问题,例如,请注意,这现在是一个 6 个字符长的字符串strencodeURIComponent('&='); // "%26%3D"
  2. unescape 实际上已贬值,但它所做的工作与 或 类似(反之亦然)。如果我们查看ES5规范,我们可以看到
    ,所以,数字是字节是“UTF-8”,但是正如我所提到的,所有字符串都是UTF-16,所以它实际上是一个UTF-16字符串,将自己限制为UTF-8decodeURIdecodeURIComponentencodeURIComponent11. 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).42