Подобно тому, как (редкие) исключения посланных комментариев/ответы ...
Можно выбрать использовать ANSI звонков в тех случаях, когда UTF-8, как ожидается, и поддерживается. Например, WriteConsoleA'ing строки UTF-8 в консоли, установленной для использования шрифта TT и работающего под chcp 65001.
Еще одним исключением является функция, которая в основном реализована как ANSI, где вариант Unicode «W» просто преобразуется в узкую строку в активной кодовой странице и вызывает аналог «A». Для такой функции, и когда доступна узкая строка, вызов варианта «А» напрямую сохраняет избыточное двойное преобразование. Дело в том, что это OutputDebugString, который попал в эту категорию до Windows 10 (я только заметил https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx, в котором упоминается, что вызов WaitForDebugEventEx - доступный только с Windows 10 - включает в себя истинный выход Unicode для OutputDebugStringW).
Тогда есть API, которые, хотя и имеют дело со строками, являются ANSI. Например, GetProcAddress существует только в варианте ANSI, который принимает аргумент LPCSTR, поскольку имена в таблицах экспорта являются узкими строками.
Это говорит о том, что большинство API-интерфейсов, основанных на строках, являются в основном Unicode, и рекомендуется использовать варианты «W». Не все новые API даже имеют вариант «А» больше (например, CommandLineToArgvW). Из уст лошадей https://msdn.microsoft.com/en-us/library/windows/desktop/ff381407.aspx:
Windows изначально поддерживает строки Unicode для элементов пользовательского интерфейса, имена файлов и т. Д. Unicode является предпочтительным кодированием символов, поскольку он поддерживает все наборы символов и языки. Windows представляет символы Unicode, используя кодировку UTF-16, в которой каждый символ кодируется как 16-битное значение. Символы UTF-16 называются широкими символами, чтобы отличать их от 8-разрядных символов ANSI.
[...] Когда Microsoft была введена поддержка Unicode в Windows, она облегчила переход, предоставляя два параллельных набор API-интерфейсов, один для строк ANSI, а другие для строк Unicode.
[...] Внутренне версия ANSI переводит строку в Unicode. Заголовки Windows также определяют макрос, который разрешает версию Unicode, когда обозначен символ препроцессора UNICODE или версия ANSI.
[...] Большинство новых API, в Windows, есть только версии Unicode, без соответствующего ANSI-версии.
[Примечание] Сообщение было отредактировано, чтобы добавить два последних абзаца.
В 2015 году никогда. –
@JonathanPotter Спасибо. – RepeatUntil
Это небольшое преувеличение. Если вы имеете дело с узкой строкой, закодированной в ASCII, например, потому что вы ее прочитали из сетевого сокета или текстового файла - нет смысла вручную преобразовывать его в UTF-16, чтобы вы могли вызывать MessageBoxW вместо MessageBoxA. (Конечно, вы должны знать, какую кодировку вы используете. Если узкая строка на самом деле находится в UTF-8, вы должны ее преобразовать в UTF-16 и вызвать MessageBoxW.) –