Как правильно портировать Win-only функцию GetMultiByteString? - PullRequest
0 голосов
/ 27 июля 2010

Я портирую код изначально только для Windows на кроссплатформенный дружественный код;один конкретный камень преткновения - попытка преобразовать вызовы функции GetMultiByteString в Windows Unicode (и любых связанных функций) в более переносимые функции на основе wchar.У меня небольшой успех, так как использование wchar приводит к преждевременному завершению цикла при попытке перебрать строки Unicode.

Как правильно использовать wchar для замены GetMultiByteString и любых других связанных функций Unicode?

1 Ответ

1 голос
/ 27 июля 2010

Вы пытаетесь превратить яблоки в апельсины здесь. MultiByteToWideChar и WideCharToMultiByte конвертируют между определенными кодировками, UTF-16 <-> множество других кодировок, включая ANSI.

3 задачи:

  1. Кодировка, с которой работает функция char <-> wchar_t в стандартной библиотеке C, определяется реализацией. Он может транслироваться между UCS-2 и ASCII, или EBDIC, или любым количеством других кодовых страниц. Вы не можете заменить функции Windows на них, потому что вы не можете предположить, что wcstombs и mbstowcs на самом деле говорят о UTF-16 или фактически говорят об ASCII. Обычно они используют кодировку UTF-32 в Unix-системах.
  2. Ящики Unix не часто распознают UTF-16 - все они основаны на UTF-8, если они вообще поддерживают Unicode.
  3. wchar_t обычно составляет 4 байта в Unix-блоках, а не 2 байта, поэтому вам придется проверить весь код, чтобы убедиться, что его размер никогда не принимается равным 2 байтам.

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

Если вы хотите быть переносимым, вам нужно определить typedef или что-то еще, чтобы ваше приложение использовало wchar_t для windows и char для всего остального. Затем вы должны предположить, что UTF-16 используется на блоках Windows, а UTF-8 используется на блоках Unix.

ИЛИ: Вы должны использовать библиотеку, такую ​​как ICU.

...