2012-04-25 3 views
1

В Javascript, как я могу преобразовать символы Unicode BMP в двоичные (и обратно)?Юникод в двоичном формате?

Я не могу найти какой-либо встроенный метод string binaryCharCodeAt() что-то подобное существует?

Если нет, то мое предположение о том, как сделать это вручную было бы создать массив, содержащий, например [00001111], [00001110], [00001100] и так далее ...

Тогда, чтобы получить двоичный, я мог бы сделать myArray[String.charCodeAt(j)]

Тогда чтобы перейти от двоичного к юникоду, я мог бы искать массив для двоичной строки, возвращая ее позицию в массиве и помещая ее в String.fromCharCode()

В этом случае эти двоичные коды произвольно назначаются и arent правильными для каждый знак. Но это нормально .. (хотя правильный был бы предпочтительнее) Мне просто нужен какой-нибудь двоичный файл.

Проблема, которую я предвижу, заключается в поиске массива, содержащего 65000+ элементов, сотни или тысячи раз, может привести к большому количеству времени обработки.

Итак, существует ли какой-либо существующий метод или библиотека, или вы можете предложить лучший способ сделать это вручную?

+0

Что вы подразумеваете под символами Unicode BMP? – Esailija

+1

@Esailija, http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane –

+0

И что не так с 'String.fromCharCode (" a ".charCodeAt (0))'. – Esailija

ответ

1

Обратите внимание, что не совсем правильно говорить «в двоичном и обратном», потому что символы 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[...].

+0

Символы BMP всегда получаются в единственном '.charCodeAt'. Javascript использует UTF-16 (или UCS2) по спецификации. Вы можете проверить это, выполнив «var l = 0x10000; while (l--) { \t console.log (String.fromCharCode (l) .charCodeAt (0) === l); } ' – Esailija

+0

@Esailija: ах, глупо меня, спасибо. Я забыл, что он спрашивал о BMP. Я оставлю записку. – ninjagecko

+0

как побочный я все еще не знаю, что задает оп, но это, кажется, лучший ответ до сих пор, так что +1: D – Esailija

-1

Используйте charCodeAt, чтобы получить десятичное число, затем позвоните по телефону toString(2), чтобы преобразовать его в двоичный.

+0

Это не двоичная строка. Байт, представленный в форме '.toString (2)', принимает 16 байт памяти и требует обработки строк для обработки ... нельзя было быть более неэффективным, даже если он попытался. – Esailija

+0

@Esailija: это неправильная причина для downvote, и манипуляции с строками кажутся вполне разумными в этом контексте. – ninjagecko

+0

@ninjagecko. Опасность OP о том, чтобы потратить много времени на обработку, будет применяться только в том случае, если вы будете использовать манипуляции и представление строк (например, представляя '0xFF' как строку' '11111111"). Если бы он не упомянул об этом в своем посте, вы, вероятно, были бы правы. – Esailija

Смежные вопросы