2012-01-12 3 views
18

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

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

+2

Yikes. Зачем кому-то это нужно? Я думаю, что мы прошли мимо Windows ME (которая была последней версией Windows, когда-либо нуждавшейся в ANSI API). Они должны умереть уже, особенно для недавно разработанных приложений. – Joey

+1

Откуда вы получаете строки UTF-8? Гораздо проще конвертировать ваше приложение, чтобы полностью работать с строками UTF-16, так как требуются так называемые функции Windows API с широкими версиями. И, как говорит Джо, * всегда * называйте широкие версии (с суффиксом 'W'), а не версиями ANSI. Они устарели десятилетиями. –

+4

@Joey: Поскольку огромные библиотеки C (++) (включая стандартную библиотеку!) Предпочитают работать с строками, основанными на символах, а не с строками 'wchar_t'. Если Windows полностью поддерживает UTF-8, вы можете просто использовать UTF-8 во всей своей программе, а не постоянно конвертировать между UTF-8 и UTF-16. – dan04

ответ

15

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

+0

Черт, я боялся этого .. :(Гах .. Лучше начните с этого тогда .. – krebstar

+12

Я бы также добавил, что, поскольку Windows использует UTF-16 исключительно, вам может быть лучше всего последовать примеру и работать с UTF -16 по большей части, и только преобразование в UTF-8, когда вам нужно читать/писать из внешних источников. – casablanca

+4

@casablanca: Другой подход, который был защищен, заключается в том, чтобы использовать UTF-8 по большей части и конвертировать в от UTF-16 только при разговоре с интерфейсом Windows. –

3

Более легкий подход (чем при использовании сырого Win32 API MultiByteToWideChar) будет использовать ATL conversion helpers, как 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" и использовать (ИМХО, более читаемый) CreateDirectory:

CreateDirectory( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 
Смежные вопросы