Функции Windows API ANSI и UTF-8 - PullRequest
       19

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

20 голосов
/ 12 января 2012

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

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

Ответы [ 2 ]

15 голосов
/ 12 января 2012

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

3 голосов
/ 14 января 2012

Более простой подход (чем использование сырого 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
);
...