俄语字符转换为二进制错误(JavaScript)

Russian characters converting to binary incorrectly (JavaScript)

本文关键字:JavaScript 错误 二进制 字符 转换 俄语      更新时间:2023-09-26

我正在用JavaScript编写一个程序,该程序需要将文本转换为8位二进制,我通过使用"exampleVariable.charCodeAt(I).toString(2)"的循环来完成,然后在前面添加"0"s,直到每个字符的二进制表示长度为8位。然而,当俄语字符被传递到函数中时,每个字符都被转换为11位二进制表示,而实际上应该是16位。例如,"д"转换为10000110100,而实际上,它应该转换为"1101000010110100"。关于如何解决这个问题有什么想法吗?

看起来您正在尝试获取字符的UTF-8表示的二进制表示。JavaScript内部使用UTF-16,因此您必须做一些工作来进行翻译。有各种各样的库,我们需要更多地了解环境,以推荐合适的工具。如果你想自己编代码,大概是:

function codepointToUTF_8(code) {
    if (code < 0x07f) {
        return [code];
    } else if (code < 0x800) {
        var byte1 = 0xc0 | (code >> 6  );
        var byte2 = 0x80 | (code & 0x3f);
        return [ byte1, byte2 ];
    } else if (code < 0x10000) {
        var byte1 = 0xe0 | ( code >> 12        );
        var byte2 = 0x80 | ((code >> 6 ) & 0x3f);
        var byte3 = 0x80 | ( code        & 0x3f);
        return [ byte1, byte2, byte3 ];
    } else {
        var byte1 = 0xf0 | ( code >> 18        );
        var byte2 = 0x80 | ((code >> 12) & 0x3f);
        var byte3 = 0x80 | ((code >>  6) & 0x3f);
        var byte4 = 0x80 | ( code        & 0x3f);
        return [ byte1, byte2, byte3, byte4 ];
    }
}
function strToUTF_8 (str) {
    var result = [];
    for (var i = 0; i < str.length; i++) {
        // NOTE: this will not handle anything beyond the BMP    
        result.push(codepointToUTF_8(str.charCodeAt(i)));
    }
    console.log('result = ', result);
    return [].concat.apply([], result);
}

function  byteToBinary (b) {
    var str = b.toString(2);
    while (str.length < 8) {
        str = '0' + str;
    }
    return str;
}
function toBinaryUTF_8 (str) {
    return strToUTF_8(str).map(byteToBinary).join(' ');
}
console.log("абвгд => '" + toBinaryUTF_8("абвгд") + "'");

当我执行这个时,我得到:

абвгд => '11010000 10110000 11010000 10110001 11010000 10110010 11010000 10110011 11010000 10110100'

我还没有彻底测试过,但它应该可以处理俄语字符。它会产生一组字符代码,如果你像以前一样翻译,每个字符有8个二进制位,你应该会没事的。