請注意,這是不完全正確的說「二進制和背部」,因爲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