2010-07-26 2 views
0

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

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

+0

Если «wchar» означает «wchar_t», то это __type__, тогда как 'GetMultiByteString()' кажется __function__ (которого я не знаю. BTW). Поскольку вы не можете заменить функцию по типу, я должен что-то упустить. Может быть, вы могли бы добавить эту информацию к своему вопросу? – sbi

+0

@sbi: Он, вероятно, говорит о 'wcstombs' и' mbstowcs'. –

+0

от wchar я имел в виду библиотеку wchar в целом; я обязательно посмотрю на wcstombs & mbstowcs, когда вернусь к этому проекту. –

ответ

1

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

3 проблемы:

  1. Кодирование, к которой символ < -> 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.

+0

Теперь, где именно появилось 'MultiByteToWideChar()' и 'WideCharToMultiByte()' in? (Вопрос о 'GetMultiByteString()'.) – sbi

+0

@sbi: GetMultiByteString не является функцией Win32. Поэтому я предположил, что он говорил о двух многобайтовых функциях в API. –

+0

Я думал, что GetMultiByteString имеет функцию только для Win32. вопрос, скорее всего, применим к любым многобайтным функциям Win32, с которыми я сталкиваюсь в этом проекте, т. к. –

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