Подтвердить что ты не робот

Функции ANSI для Windows API и UTF-8

Можно ли использовать функции ANSI Windows API со строками UTF-8?

Например, скажем, у меня есть путь, закодированный в UTF-8. Могу ли я вызвать CreateDirectoryA или CreateFileA и использовать путь UTF-8, или мне нужно выполнить некоторое преобразование перед вызовом функций?

4b9b3361

Ответ 1

Нет. Используйте MultiByteToWideChar для преобразования UTF-8 в UTF-16, а затем вызовите широкоформатные API-интерфейсы, такие как CreateDirectoryW или CreateFileW.

Ответ 2

Более простой подход (чем использование необработанного Win32 API MultiByteToWideChar) заключается в использовании помощников преобразования ATL, например CA2CW, Вы можете указать CP_UTF8 как кодовую страницу (второй параметр в конструкторе), чтобы преобразовать из Unicode UTF-8 в Unicode UTF-16:

CreateDirectoryW( 
  CA2W( utf8Name, CP_UTF8 ) // convert from UTF-8 to UTF-16
  ... // other stuff
);

Обратите внимание, что в Unicode-сборках (которые в наши дни должны быть стандартными) CreateDirectory просто расширяется до CreateDirectoryW, поэтому я просто удаляю окончание "W" и использую (IMHO, более читаемый) CreateDirectory:

CreateDirectory( 
  CA2W( utf8Name, CP_UTF8 ) // convert from UTF-8 to UTF-16
  ... // other stuff
);