Java中的string.getBytes("UTF-8")在JavaScript中的等价方法是什么?

14

我有一个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个回答

19
您可以使用 编码Living Standard 中的TextEncoder。根据Chromium仪表板中编码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]

那么,要获取总字节数,就像Java的.getBytes()一样吗?在数组中添加值?即Array.from(new TextEncoder().encode('some delicious cookie')).reduce((acc, current) => acc + current, 0) - Neil Gaetano Lindberg
这个答案来自2014年,需要更新说明不再需要polyfill,并且该API在所有当前浏览器上都得到支持:https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder - dcow

10

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个字符长的字符串。
  2. unescape实际上已经被弃用了,但它和decodeURIdecodeURIComponentencodeURIComponent的反向操作)完成类似的工作。如果我们看一下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-8

我不能忘记这是不同的,因为我需要中文支持。 - user429620
顺便提一句,如果你在阅读这篇文章,他们建议使用unescape(encodeUricomponent())来从UTF16获取UTF8值:http://ecmanaut.blogspot.be/2006/07/encoding-decoding-utf8-in-javascript.html - user429620
那么,有解决方案吗? - user429620
你是否正在以_UTF-8_的形式提供页面?我开始怀疑您是否在使用不支持所有字符的不同字符编码提供页面,然后想将其中的格式错误的字符串转换为_UTF-8_。 (这将非常困难,因为浏览器在_JavaScript_看到之前会进行_Stream->字符串(在流的编码中)->UTF-16_转换。 - Paul S.
谢谢,就是这样。标题被覆盖了。 - user429620
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接