请注意,这是不完全正确的说“二进制和背部”,因为Unicode字符并不需要有一个唯一的二进制表示(这取决于编码,例如UTF-8)。不过,我相信大多数UTF -...编码在二进制编码方面是相互向后兼容的。
不过既然你说你不在乎你使用的是什么编码,你可以做的完全一样Kolink说(他的回答是不正确downvoted,但还没有完成):
编辑:作为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[...]
。
你是什么BMP Unicode字符意味着什么? – Esailija 2012-04-25 16:16:37
@Esailija,http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane – 2012-04-25 16:20:17
什么错'使用String.fromCharCode( “A” .charCodeAt(0))'。 – Esailija 2012-04-25 16:24:45