javascript - 统一码转二进制?

标签 javascript unicode binary type-conversion

在 Javascript 中,如何将 BMP unicode 字符转换为二进制(以及反之)?

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

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

然后要获取二进制文件,我可以执行 myArray[String.charCodeAt(j)]

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

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

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

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

最佳答案

请注意,“到二进制再返回”并不完全正确,因为 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[...] .

关于javascript - 统一码转二进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10319415/

相关文章:

http - 没有 Accept header 的 AWS API Gateway 二进制输出

javascript - 添加自定义按钮以 react 导航底部TabNavigator?

javascript - 在javascript中验证后无法提交表单

unicode - Elasticsearch对Unicode字符使用了错误的大小写折叠

python - "print s"与 "print [s]"中使用的不同编码?

javascript - JavaScript 中的字符串长度(以字节为单位)

使用谷歌应用程序的 Java 序列化不起作用

javascript - 使用 Yeoman 的 Angular-fullstack 生成器时,如何访问前端的环境变量?

javascript - 将原生 JS 转换为 Angularjs 以计算两个日期之间的天数?

c - 在二进制文件中搜索模式