Win32 API
Функции Ansi- и Wide-character
Поиск…
Вступление
Документация Windows API для функций, принимающих одну или несколько строк в качестве аргумента, будет выглядеть следующим образом:
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
Тип данных для двух параметров строки состоит из нескольких частей:
- LP = длинный указатель
- C = const
- T = TCHAR
- STR = строка
Теперь, что означает TCHAR
? Это зависит от платформы, выбранной для компиляции программы.
CopyFile
сам по себе является макросом, который определяет что-то вроде этого:
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif
Таким образом, на самом деле есть две функции CopyFile
и в зависимости от флагов компилятора макрос CopyFile
будет разрешен к тому или иному.
Там основной токен, TCHAR
определяется как:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Итак, опять же, в зависимости от флагов компиляции, TCHAR является «узким» или «широким» (2 байта) символом.
Поэтому, когда UNICODE определен, CopyFile
определяется как CopyFileW
, который будет использовать 2-байтовые массивы символов в качестве их параметра, которые, как ожидается, будут кодироваться в кодировке UTF-16.
Если UNICODE не определен, CopyFile
определяется как CopyFileA
который использует однобайтовые массивы символов, которые, как ожидается, будут закодированы в кодировке ANSI по умолчанию для текущего пользователя.
Есть два аналогичных макроса: UNICODE
заставляет API Windows ожидать широкие строки и _UNICODE
(с ведущим подчеркиванием), который позволяет использовать аналогичные функции в библиотеке времени выполнения C.
Эти определения позволяют нам писать код, который компилируется как в ANSI, так и в режиме Unicode.
Важно знать, что кодировка ANSI может быть однобайтовой кодировкой (то есть латинским-1) многобайтовой кодировкой (т. Е. Сдвигом jis), хотя, к сожалению, utf-8 не поддерживается.
Это означает, что ни ANSI, ни широкоформатный вариант этих функций не могут использоваться для кодирования с фиксированной шириной.