Вы пытаетесь превратить яблоки в апельсины здесь. MultiByteToWideChar и WideCharToMultiByte конвертируют между определенными кодировками, UTF-16 <-> множество других кодировок, включая ANSI.
3 задачи:
- Кодировка, с которой работает функция char <-> 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.