本文介紹了Java字符串.getBytes(&Quot;UTF-8&Quot;)javascript等效項的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我在Java中有這個字符串:
"test.message"
byte[] bytes = plaintext.getBytes("UTF-8");
//result: [116, 101, 115, 116, 46, 109, 101, 115, 115, 97, 103, 101]
如果我在Java腳本中執(zhí)行相同的操作:
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]
我的印象是取消轉義(encodeURIComponent())會將字符串正確地轉換為UTF-8。難道不是這樣嗎?
引用:
http://ecmanaut.blogspot.be/2006/07/encoding-decoding-utf8-in-javascript.html
推薦答案
沒有字符串的字符編碼概念,所有內容都在UTF-16中。大多數(shù)情況下,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))
在做什么?讓我們逐個來看一下
encodeURIComponent
正在將str
中在URI語法中非法或有意義的每個字符轉換為URI轉義版本,以便將其用作URI的搜索組件中的鍵或值沒有問題,例如encodeURIComponent('&='); // "%26%3D"
請注意,這現(xiàn)在是一個6個字符長的字符串。unescape
實際上是折舊的,但它的工作類似于decodeURI
或decodeURIComponent
(與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
數(shù)字是2
字節(jié)是“UTF-8”,但是,正如我所提到的,所有字符串都是UTF-16,所以它實際上是將其自身限制為UTF-8的UTF-16字符串。
這篇關于Java字符串.getBytes(&Quot;UTF-8&Quot;)javascript等效項的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,