java string.getBytes(“UTF-8”)javascript等效项
我有一个java字符串: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
"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]