Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java string.getBytes(“UTF-8”)javascript等效项_Java_Javascript_Utf 8_Byte_Utf 16 - Fatal编程技术网

java string.getBytes(“UTF-8”)javascript等效项

java string.getBytes(“UTF-8”)javascript等效项,java,javascript,utf-8,byte,utf-16,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(encodeURICo

我有一个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;
    },
我的印象是,unescape(encodeURIComponent())可以正确地将字符串转换为UTF-8。不是这样吗

参考:

JavaScript没有字符串字符编码的概念,所有内容都是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))
在做什么呢?让我们逐一看一看

  • 正在将
    str
    中非法或在URI语法中有意义的每个字符转换为URI转义版本,以便将其用作URI的搜索组件中的键或值(例如
    encodeURIComponent(“&=”);//“%26%3D”
    请注意这是一个6个字符长的字符串
  • 实际上已折旧,但它的工作与
    decodeURI
    decodeURIComponent
    (与
    encodeURIComponent
    相反)。如果我们看一下,我们可以看到
    11。设c为字符,其代码单位值为整数,由结果(1)中位置k+2、k+3、k+4和k+5处的四个十六进制数字表示。

    所以,
    4
    数字是
    2
    字节是“UTF-8”,然而正如我所提到的,所有字符串都是UTF-16,所以它实际上是一个UTF-16字符串,只限于UTF-8

  • 您可以使用
    textcoder
    ,它是的一部分。根据Chromium仪表板上的条目,它在Firefox中发布,并将在Chrome38中发布。也有一个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]
    

    我不能忘记这有什么不同,因为我需要对中文的支持。顺便说一句,如果你读了这篇文章,他们建议使用unescape(encodeUricomponent())从utf16获取utf8值:那么,有解决方案吗?@Wesley我应该测试你的代码;实际上,我无法再现您得到的“错误”结果,我得到的结果与您预期的相同,当我尝试反转您奇怪的输出时,我得到了
    “£H²Hñ+C|”
    您是否以UTF-8的形式提供页面?我开始想,也许你是在用一种不同的字符编码服务页面,它不支持你所有的字符,然后想将其中格式错误的字符串转换成UTF-8。(这将是非常困难的,因为浏览器在JavaScript看到它之前进行流->字符串(在流的编码中)->UTF-16转换。然后,为了获得总字节数,比如Java的
    .getBytes()
    ?在数组中添加值?即
    数组。from(new textcoder().encode('some delicious cookie')。reduce((acc,current)=>acc+电流,0)
    var s = "test.message";
    var encoder = new TextEncoder();
    encoder.encode(s);
    // [116, 101, 115, 116, 46, 109, 101, 115, 115, 97, 103, 101]