1

在 Javascript 中,如何将 BMP unicode 字符转换为二进制(并返回)?

我似乎找不到任何内置的字符串方法binaryCharCodeAt()是否存在类似的东西?

如果没有,我对如何手动操作的猜测是创建一个包含例如[00001111], [00001110], [00001100]等的数组......

然后得到二进制,我可以做myArray[String.charCodeAt(j)]

然后从二进制到 unicode,我可以在数组中搜索二进制字符串,返回它在数组中的位置,并将其放入String.fromCharCode()

在这种情况下,这些二进制代码是任意分配的,并且不是每个字符的正确代码。但这没关系..(虽然最好是正确的)我只需要任何二进制文件。

我预见的问题是,搜索包含 65000 多个项目的数组,数百或数千次,最终可能会花费大量的处理时间。

那么,是否有任何预先存在的方法或库,或者您能否建议一种更好的手动执行此操作的方法?

4

2 回答 2

3

请注意,说“二进制并返回”并不完全正确,因为 unicode 字符不需要具有唯一的二进制表示(它取决于编码,例如 UTF-8)。但是,我相信大多数 UTF-... 编码在二进制编码方面彼此向后兼容。

但是既然你说你不在乎你使用的是什么编码,你可以完全按照 Kolink 所说的去做(他的回答被错误地否决了,但也不完整):

编辑:正如 Esailija 指出的那样,OP 只对基本的多语言平面字符感兴趣,它们只有一个代码点。下面的代码有点矫枉过正,但仍然适用于 BMP 和非 BMP 代码点。

"some string".charCodeAt给你一些编码的代码点的十六进制。就我而言,它是 UTF-16:

"".charCodeAt(0)==55356
"".charCodeAt(1)==56513

在 UTF-16 中,这是0xF0 0x9F 0x83 0x81( f09f8381),或 "\uD83C\uDCC1":

"\uD83C\uDCC1"==""

你不能仅仅假设 charCodeAt 会给你你想要的数字而不需要做一些工作。Unicode 是一种可变宽度编码。因此,您可以执行以下操作以获得自洽的结果。

var UTF_BITS = 16;

function padLeftTo(string, padChar, numChars) {
    return (new Array(numChars-string.length+1)).join(padChar) + string;
}

function unicodeToBinary(char) {
    return char.split('').map(function(codepoint) {
        return padLeftTo(codepoint.charCodeAt(0).toString(2), 0, UTF_BITS);
    }).join('').split('').map(function(char){return parseInt(char)});
    //         ^^^^( ignore this part if you just want a string )^^^^
}

function binaryToUnicode(binaryList) {
    var codepointsAsNumbers = [];
    while( binaryList.length>0 ){
        var codepointBits = binaryList.slice(0,UTF_BITS);
        binaryList = binaryList.slice(UTF_BITS);
        codepointsAsNumbers.push( parseInt(codepointBits.join(''),2) );
    }
    return String.fromCharCode.apply(this,codepointsAsNumbers);
}

演示:

> unicodeToBinary("")
[1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1]

> binaryToUnicode(unicodeToBinary(""))
""

请注意,由于您没有说明您的用例是什么,因此二进制文件可能并不是您真正想要的。例如,如果您满足于唯一标识符,您可以使用字符串本身,或者十六进制字符串甚至整数表示。您更有可能想要一个更简单的表示。

完整的旁注:如果您打算将对象用作查找表,则可以只使用原始原始字符串“”作为键,例如table={}; table[""]='something'; table[""]. 但是,由于 unicode 3.2 标准中有 95156 个字符,我不建议在内存中做任何这样的事情。你还说了一些让我觉得你不熟悉查找表的性能的话:如果你不知道,它需要 O(1) 时间来做table[...]

于 2012-04-25T18:22:56.673 回答
0

用于charCodeAt获取十进制数,然后调用toString(2)它以将其转换为二进制。

于 2012-04-25T16:05:51.913 回答