Как преобразовать идентификатор символа ANSI в идентификатор символа Unicode с помощью javascript?

Функция fromCharCode не работает с международными символами ANSI. Например, для русских символов ANSI (cp-1251) с идентификатором от 192 до 223 возвращаются специальные символы. Как решить эту проблему?

Я думаю, что необходимо преобразовать идентификатор символа ANSI в идентификатор символа Unicode, а затем использовать fromCharCode. Но как преобразовать идентификатор символа ANSI в идентификатор символа Unicode (в зависимости от текущей локали/кодовой страницы)?

Большое спасибо за помощь!


person Dmitry    schedule 09.08.2012    source источник
comment
Используете ли вы «ANSI» для обозначения некоторых кодовых наборов ISO 8859-n? ? Если нет, то что вы подразумеваете под «российским ANSI»? Если вы имеете дело с символами SBCS (однобайтовый кодовый набор), выходящим за пределы диапазона ASCII (0–127 десятичных знаков), то вы должны знать кодовый набор, чтобы иметь возможность точно интерпретировать значения в диапазоне 128–255 как Unicode. персонажи. То есть 0xC0 (192) имеет разные значения в 8859-1 и 8859-2 и 8859-3 и... поэтому, чтобы преобразовать 0xC0 или 192 в символ Unicode, вы должны знать, с какого кодового набора вы начали.   -  person Jonathan Leffler    schedule 09.08.2012
comment
Я знаю, что для скрытия следует использовать текущую кодовую страницу. Русский ANSI — CP-1251.   -  person Dmitry    schedule 09.08.2012
comment
Не существует такого понятия, как русско-американский национальный институт стандартов.   -  person tripleee    schedule 09.08.2012
comment
tripee, а как правильно написать, cp-1251?   -  person Dmitry    schedule 09.08.2012
comment
@tripleee, обвиняйте MS в том, что они называют CP режима DOS / Windows OEM и ANSI.   -  person Oleg V. Volkov    schedule 09.08.2012
comment
Да, я знаю. Да, кодовая страница Windows 1251 правильная и понятная.   -  person tripleee    schedule 09.08.2012


Ответы (2)


Учитывая, что вы знаете кодовую страницу, в которой закодированы ваши данные, просто настройте объект сопоставления с ключами, являющимися кодами в вашей кодовой странице, и значениями, являющимися правильными символами Unicode или числовыми кодовыми точками, и используйте его для преобразования ваших данных.

mapFromCP1251 = {
   192: 'А',
   193: 'Б',
   194: 'В',
   197: 'Е',
   200: 'И',
   204: 'М',
   207: 'П',
   208: 'Р',
   210: 'Т'
   // etc, I don't feel like typing entire http://en.wikipedia.org/wiki/CP1251 here
}

var string = mapFromCP1251[192] + mapFromCP1251[192] + mapFromCP1251[192] + mapFromCP1251[193] + mapFromCP1251[193] + mapFromCP1251[194]
alert(string) // АААББВ
alert(mapFromCP1251[207]+mapFromCP1251[208]+mapFromCP1251[200]+mapFromCP1251[194]+mapFromCP1251[197]+mapFromCP1251[210]+", "+mapFromCP1251[204]+mapFromCP1251[200]+mapFromCP1251[208]+"!") // Hello, world!
person Oleg V. Volkov    schedule 09.08.2012
comment
@Altaveron, это довольно просто. Вот пример, чтобы дать вам начало. - person Oleg V. Volkov; 09.08.2012
comment
Спасибо. Но мне нужно универсальное международное преобразование в зависимости от локали/кодовой страницы. - person Dmitry; 09.08.2012
comment
@Altaveron, неудивительно, что это будет означать, что вам придется создать весь репертуар преобразований из всех возможных CP ANSI. На самом деле это не так сложно, поскольку большая часть этих данных доступна в Интернете в форматах, достаточно простых для анализа. Однако это также может означать, что вы ведете неправильную битву. Современные программы чаще всего должны работать в Unicode. Что именно ты пытаешься сделать? - person Oleg V. Volkov; 09.08.2012

Это единственная библиотека, которая решает эту проблему: https://github.com/Niggler/js-codepage

Но это занимает 1,5 МБ. Вероятно, если вам нужно всего несколько наборов символов, это займет гораздо меньше.

person Vanuan    schedule 14.10.2013