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