俄语字符转换为二进制不正确(JavaScript)

时间:2015-11-28 16:25:36

标签: javascript binary

我正在用JavaScript编写一个程序,需要将文本转换为8位二进制文​​件,我用一个使用“exampleVariable.charCodeAt(i).toString(2)”的循环完成,然后追加“0”到前面,直到每个字符的二进制表示的长度是8位。但是,当俄语字符传递给函数时,每个字符都转换为11位二进制表示,而它实际上应该是16位。例如,“д”转换为10000110100,实际上它应该转换为“1101000010110100”。有想法该怎么解决这个吗?

1 个答案:

答案 0 :(得分:1)

看起来你正试图获得角色的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个二进制位,你应该没问题。