JavaString.getBytes(“UTF8”)JavaScript模拟
在那里编写的函数可以正常工作,即JavaString.getBytes(“UTF8”)JavaScript模拟,java,javascript,string,utf-8,byte,Java,Javascript,String,Utf 8,Byte,在那里编写的函数可以正常工作,即pack(unpack(“string”)产生“string”。但是我希望得到与Java中的“string.getBytes(“UTF8”)相同的结果 问题是如何使一个函数提供与JavaScript中的JavaGetBytes(“UTF8”)相同的功能 对于拉丁字符串,上述文章中的unpack(str)提供了与getBytes(“UTF8”)相同的结果,只是它为奇数位置添加了0。但对于非拉丁字符串,它的工作原理完全不同,因为在我看来。有没有一种方法可以像Java一
pack(unpack(“string”)
产生“string”
。但是我希望得到与Java中的“string.getBytes(“UTF8”)
相同的结果
问题是如何使一个函数提供与JavaScript中的JavaGetBytes(“UTF8”)相同的功能
对于拉丁字符串,上述文章中的unpack(str)
提供了与getBytes(“UTF8”)
相同的结果,只是它为奇数位置添加了0
。但对于非拉丁字符串,它的工作原理完全不同,因为在我看来。有没有一种方法可以像Java一样在JavaScript中处理字符串数据?您可以使用此函数():
如果您希望127以上的值为负数,就像Java的字节到整数转换一样,您必须调整常量并使用
utf8.push(0xffffffc0 | (charcode >> 6),
0xffffff80 | (charcode & 0x3f));
及
下面的函数将处理U+FFFF以上的函数 因为javascript文本在UTF-16中,所以字符串中使用两个“字符”来表示BMP上方的字符,charCodeAt返回相应的代理代码。fixedCharCodeAt处理这个问题
function encodeTextToUtf8(text) {
var bin = [];
for (var i = 0; i < text.length; i++) {
var v = fixedCharCodeAt(text, i);
if (v === false) continue;
encodeCharCodeToUtf8(v, bin);
}
return bin;
}
function encodeCharCodeToUtf8(codePt, bin) {
if (codePt <= 0x7F) {
bin.push(codePt);
} else if (codePt <= 0x7FF) {
bin.push(192 | (codePt >> 6), 128 | (codePt & 63));
} else if (codePt <= 0xFFFF) {
bin.push(224 | (codePt >> 12),
128 | ((codePt >> 6) & 63),
128 | (codePt & 63));
} else if (codePt <= 0x1FFFFF) {
bin.push(240 | (codePt >> 18),
128 | ((codePt >> 12) & 63),
128 | ((codePt >> 6) & 63),
128 | (codePt & 63));
}
}
function fixedCharCodeAt (str, idx) {
// ex. fixedCharCodeAt ('\uD800\uDC00', 0); // 65536
// ex. fixedCharCodeAt ('\uD800\uDC00', 1); // 65536
idx = idx || 0;
var code = str.charCodeAt(idx);
var hi, low;
if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
hi = code;
low = str.charCodeAt(idx+1);
if (isNaN(low)) {
throw(encoding_error.invalid_surrogate_pair.replace('%pos%', idx));
}
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
}
if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
// We return false to allow loops to skip this iteration since should have already handled high surrogate above in the previous iteration
return false;
/*hi = str.charCodeAt(idx-1);
low = code;
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;*/
}
return code;
}
函数encodeTextToUtf8(文本){
var-bin=[];
对于(变量i=0;i12),
128 |((代码>>6)和63),
128 |(codePt&63));
}否则,如果(代码点>18),
128 |((代码点>>12)和63),
128 |((代码>>6)和63),
128 |(codePt&63));
}
}
函数fixedCharCodeAt(str,idx){
//例如fixedCharCodeAt('\uD800\uDC00',0);//65536
//例如fixedCharCodeAt('\uD800\uDC00',1);//65536
idx=idx | | 0;
var代码=str.charCodeAt(idx);
var高,低;
如果(0xD800您不需要编写完整的UTF-8编码器;有一种更简单的JS习惯用法可以将Unicode字符串转换为表示UTF-8代码单元的字节字符串:
unescape(encodeURIComponent(str))
(这是因为escape
/unescape
使用的奇数编码使用%xx
十六进制序列用该代码表示ISO-8859-1字符,而不是URI组件转义使用的UTF-8。类似地,decodeURIComponent(escape(字节))
使用的是另一个方向。)
因此,如果您希望输出一个数组,它将是:
function toUTF8Array(str) {
var utf8= unescape(encodeURIComponent(str));
var arr= new Array(utf8.length);
for (var i= 0; i<utf8.length; i++)
arr[i]= utf8.charCodeAt(i);
return arr;
}
函数toUTF8Array(str){
var utf8=unescape(encodeURIComponent(str));
var arr=新数组(utf8.长度);
对于(var i=0;itextcoder
是的一部分,根据Chrome仪表板的条目,它在Firefox中提供,并将在Chrome 38中提供。对于其他浏览器,也有一个polyfill
下面的JavaScript代码示例返回一个Uint8Array
,其中填充了您期望的值
(new TextEncoder()).encode("string")
// [115, 116, 114, 105, 110, 103]
betters展示的一个更有趣的例子是UTF-8将字符串中的替换为îñ:
(new TextEncoder()).encode("strîñg")
[115, 116, 114, 195, 174, 195, 177, 103]
也许吧?不…“中".getBytes(“UTF8”)
产生{-28,-72,-83}
,但是从答案到[78,45]的函数
@Kremchik JavaScript使用UTF-16,因此0
s——它们是每个16位代码单元的上半部分。根据UTF-8方案编码时,该汉字需要3个字节,而通过UTF-16只需要2个字节。这是最好的答案,做得很好。也是优雅的代码。我将该方法缩小,并为toUTF8Array添加了一个反向方法
,最后一步是将其全部放入字符串中。prototype
,这使用法更加清晰和简单。请查看:。这似乎比公认的解决方案,即公认的位篡改自定义实现要好得多。
function toUTF8Array(str) {
var utf8= unescape(encodeURIComponent(str));
var arr= new Array(utf8.length);
for (var i= 0; i<utf8.length; i++)
arr[i]= utf8.charCodeAt(i);
return arr;
}
(new TextEncoder()).encode("string")
// [115, 116, 114, 105, 110, 103]
(new TextEncoder()).encode("strîñg")
[115, 116, 114, 195, 174, 195, 177, 103]