Вы пытаетесь преобразовать яблоки в апельсины здесь. MultiByteToWideChar и WideCharToMultiByte конвертировать между конкретными кодировками, UTF-16 < -> множество других кодировок, включая ANSI.
3 проблемы:
- Кодирование, к которой символ < -> wchar_t функции в стандартной библиотеке C работает, определяется реализацией. Он может переводить между UCS-2 и ASCII, или EBDIC, или любым количеством других кодовых страниц. Вы не можете заменить эти функции Windows, потому что вы не можете предположить, что wcstombs и mbstowcs фактически говорят о UTF-16 или фактически говорят об ASCII. Обычно фактическая кодировка, которую они используют, - UTF-32 в unix-блоках.
- Unix-боксы не часто распознают UTF-16 - все они основаны на UTF-8, если они поддерживают Unicode вообще.
wchar_t
, как правило, 4 байта в блоках unix, а не 2 байта, поэтому вам нужно будет проверить весь свой код, чтобы гарантировать, что его размер никогда не считался 2 байтами.
Проще говоря, нет абсолютно портативного способа борьбы с такими вещами, если вы не написали код, чтобы сделать кодировку самостоятельно.
Если вы хотите быть портативным, вам нужно определить typedef или что-то еще, чтобы ваше приложение использовало wchar_t для Windows и char для всего остального. Затем вы должны предположить, что UTF-16 используется в ящиках Windows, а UTF-8 используется в unix-блоках.
ИЛИ: Вы должны использовать библиотеку, такую как ICU.
Если «wchar» означает «wchar_t», то это __type__, тогда как 'GetMultiByteString()' кажется __function__ (которого я не знаю. BTW). Поскольку вы не можете заменить функцию по типу, я должен что-то упустить. Может быть, вы могли бы добавить эту информацию к своему вопросу? – sbi
@sbi: Он, вероятно, говорит о 'wcstombs' и' mbstowcs'. –
от wchar я имел в виду библиотеку wchar в целом; я обязательно посмотрю на wcstombs & mbstowcs, когда вернусь к этому проекту. –