【问题标题】:Russian characters converting to binary incorrectly (JavaScript)俄语字符错误地转换为二进制 (JavaScript)
【发布时间】:2016-03-02 14:42:17
【问题描述】:

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

【问题讨论】:

  • JavaScript 字符串使用 UTF-16 - 每个字符都是 16 位,而不是 8 位。
  • 当我将“a”转换为二进制时,结果是“01100001”。我猜这就是我所说的 8 位。
  • 那么你想得到什么字符编码? UTF-8?
  • 是的,除了俄语字符用 16 位表示......我想。 (如果你没有注意到,我对此了解不多)。
  • 俄语字符适合 UTF-16 16 位空间,但对于 UTF-8,它们需要一个前缀字节(正如您在问题中所写)。您必须通过following the rules for UTF-8 character encoding. 自己执行该转换

标签: javascript binary


【解决方案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 个二进制位进行翻译,应该没问题。

【讨论】:

  • 谢谢伙计!我认为这正是我需要的:D。
  • 所以也许我只是一个 n00b,但是...我无法将 UTF-8 数字转换为二进制工作...我应该如何处理数字来转换它们二进制? .charCodeAt(i).toString(2) 不起作用,因为数字不再是字符串形式。 (我是 JavaScript 新手……你能告诉我吗?)。
  • 我添加了更多代码来展示如何使用转换功能。希望对您有所帮助...
  • 哦,现在我知道它是如何工作的了。谢谢朋友,你真的很有帮助! :D。如果我只使用这段代码就可以了(只需进行微小的更改以防止可能的变量名冲突)?
  • 去吧 - 复制出去
猜你喜欢
  • 2017-06-09
  • 2017-04-07
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2017-04-09
相关资源
最近更新 更多