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