Функции foo
без суффикса на самом деле являются макросами.Функции fooA
устарели и являются простыми обертками вокруг функций fooW
, которые являются единственными, которые фактически выполняют работу.Windows использует строки UTF-16 для всего, поэтому, если вы хотите продолжить использовать строки UTF-8, вы должны конвертировать их для каждого вызова API (например, с помощью MultiByteToWideChar
).
Для открытого интерфейса вашей библиотекипридерживайтесь только одной кодировки: UTF-16, UTF-32 или UTF-8.Все остальное (зависящее от локали или от ОС) слишком сложно для вызывающих.Вам не нужен UTF-8 для совместимости с другими ОС: многие независимые от платформы библиотеки, такие как ICU, Qt или стандартные библиотеки Java, используют UTF-16 во всех системах.Я думаю, что выбор между тремя кодировками Unicode зависит от того, какую ОС вы ожидаете, библиотека будет использоваться чаще всего: если она будет в основном использоваться в Windows, придерживайтесь UTF-16, чтобы вы могли избежать всех преобразований строк.В Linux UTF-8 является обычным выбором в качестве кодировки файловой системы или терминала (поскольку это единственная кодировка Unicode с 8-битным символьным блоком), но см. Примечание выше относительно библиотек.OS X использует UTF-8 для своего интерфейса POSIX и UTF-16 для всего остального (Carbon, Cocoa).
Некоторые замечания по терминологии: слова «ANSI» и «Unicode», используемые в документации Microsoft,не в соответствии с тем, что говорят международные стандарты.Когда Microsoft говорит о «Юникоде» или «широких символах», они означают «UTF-16» или (исторически) его подмножество BMP (с одной единицей кода на кодовую точку).«ANSI» на языке Microsoft означает некую устаревшую кодировку, зависящую от локали, которая полностью устарела во всех современных версиях Windows.
Если вам нужна четкая рекомендация, перейдите на UTF-16 и библиотеку ICU.