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;i
textcoder
是的一部分,根据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]