Обратите внимание, что не совсем правильно говорить «в двоичном и обратном», потому что символы Unicode не обязательно должны иметь уникальное двоичное представление (это зависит от кодировки, например, UTF-8). Однако я считаю, что большинство кодировок UTF -... обратно совместимы друг с другом с точки зрения двоичных кодировок.
Но так как вы заявили, что вы не все равно, что кодирование вы используете, вы можете сделать именно так, как сказал Kolink (его ответ был неправильно downvoted, но также не полный):
редактировать: Как Esailija указывает, что OP интересовался только базовыми многоязычными персонажами, которые имеют только один код. Ниже приведен код overkill, хотя он все равно будет работать как с 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(""))
""
Обратите внимание, что, так как вы не сказали, что ваш вариант использования был, двоичная не может быть на самом деле то, что вы хотите. Например, если вы довольствуетесь уникальными идентификаторами, вы можете использовать сами строки или шестнадцатеричные или даже целочисленные представления. Скорее всего, вы хотите получить более простое представление.
полный sidenote: Если вы планируете использовать объект в качестве таблицы поиска, вы можете просто использовать оригинальную исходную строку «» в качестве ключа, например. table={}; table[""]='something'; table[""]
. Однако, поскольку в стандарте unicode 3.2 есть 95156 символов, я бы не предложил делать такие вещи в памяти. Вы также сказали что-то, что заставило меня подумать, что вы не знакомы с работой справочной таблицы: в случае, если вы не знали, для выполнения 0 (0) времени требуется table[...]
.
Что вы подразумеваете под символами Unicode BMP? – Esailija
@Esailija, http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane –
И что не так с 'String.fromCharCode (" a ".charCodeAt (0))'. – Esailija