Поиск…


Вступление

Документация 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, ни широкоформатный вариант этих функций не могут использоваться для кодирования с фиксированной шириной.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow