【问题标题】:java string.getBytes("UTF-8") javascript equivalentjava string.getBytes("UTF-8") 等效的javascript
【发布时间】:2014-05-16 17:02:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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]
    

    【讨论】:

    • 然后,获取总字节数,如 Java 的 .getBytes()?在数组中添加值?即Array.from(new TextEncoder().encode('some delicious cookie')).reduce((acc, current) =&gt; acc + current, 0)
    • 这个答案来自 2014 年,应该更新以注意不再需要 polyfill 并且所有当前浏览器都支持 api:developer.mozilla.org/en-US/docs/Web/API/TextEncoder
    【解决方案2】:

    JavaScriptString 没有字符编码的概念,一切都在 UTF-16 中。大多数情况下,UTF-16char 的值与 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('&amp;='); // "%26%3D" 请注意,现在这是一个 6 个字符长的 String
    2. unescape 实际上是折旧的,但它与decodeURIdecodeURIComponent (与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 字节是 "UTF-8",但是正如我提到的,所有 字符串 都是 UTF-16 ,所以它实际上是一个 UTF-16 字符串,将自身限制为 UTF-8

    【讨论】:

    • 我不能忘记它有什么不同,因为我需要对中文的支持。
    • 顺便说一句,如果您阅读此内容,他们建议使用 unescape(encodeUricomponent()) 从 utf16 获取 utf8 值:ecmanaut.blogspot.be/2006/07/…
    • 那么,有解决办法吗?
    • @Wesley 我应该实际测试你的代码;我实际上无法重现您的“错误”结果,我得到的结果与您预期的相同,当我尝试反转您的奇怪输出时,我得到 "£H²Hôñ+C|"
    • 您是否以 UTF-8 格式提供页面?我开始认为您可能正在以不支持所有字符的不同字符编码为页面提供服务,然后想将其中的格式错误的字符串转换为 UTF-8。 (这将非常困难,因为浏览器会在 JavaScript 看到它之前进行 Stream -> String(在 Stream 的编码中)-> UTF-16 转换。
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 2019-11-29
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2014-06-12
    相关资源
    最近更新 更多