Как мне перейти с UTF-8 char * на динамическое кодирование с Win32 API? - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я работаю над проектом, который использует Hunspell внутри Node.Цель - кросс-платформенная проверка орфографии, которая правильно работает с кодировкой (node-spellchecker).

Я должен использовать произвольные словари, которые имеют разные кодировки.Большинство из них имеют SET UTF-8 в файле *.aff, но другие словари имеют кодировки, такие как SET ISO8859-1.Я получаю UTF-8 от Node, но мне нужно преобразовать его в кодировку для словаря.Затем мне нужно преобразовать его в обратном порядке, чтобы обработать предложения.

В Linux я могу использовать iconv для преобразования, но у меня этого нет на стороне Windows.Однако я не хотел бы требовать словари UTF-8 (это работает).

Будем весьма благодарны за любые предложения или подсказки, с чего начать.WideCharToMultiByte используется за один шаг, но я не смог найти MultiByteToMultiByte, который ожидал бы.

Вещи, которые у меня есть

const char *from_encoding_name = "UTF-8"; // This can be swapped
const char *to_encoding_name = "ISO8859-1"; // This can be swapped
const char *word = /* möchtzn encoded in UTF-8 */;

Вещи, которые я хочу

const char *dictionaryWord = /* möchtzn encoded in ISO-8859-1 */;

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

FYI, iconv.exe доступно для Windows, вам просто нужно установить его вручную.Или вы можете встроить libiconv непосредственно в ваш проект.

При этом, то, что вы просите, может быть сделано с помощью API-интерфейсов Microsoft:

  1. Win32 MultiByteToWideChar() и WideCharToMultiByte() функции.Сначала декодируйте вход UTF-8 в UTF-16, используя MultiByteToWideChar(CP_UTF8), а затем кодируйте UTF-16 в ISO-8859-1, используя WideCharToMultiByte(28591) (или любую нужную целевую кодовую страницу, которая вам нужна).А затем просто поменяйте местами кодовые страницы при переходе в другую сторону.

  2. метод IMultiLanguage::ConvertString() или IMultiLanguage::CreateConvertCharset() и IMLangConvertCharset::DoConversion() методы.Они могут преобразовывать ввод из одной кодовой страницы непосредственно в другую.

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

0 голосов
/ 19 декабря 2018

Не думаю, что аналог MultiByteToMultiByte существует в WinAPI.Я бы использовал два звонка: MultiByteToWideChar и затем WideCharToMultiByte.

Кстати, я изучил источники .Net-метода Encoding.Convert и там также выполняется преобразование через UTF-16.

...