在 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/