Работа со строками

Windows изначально поддерживает строки в юникоде для элементов пользовательского интерфейса, имен файлов и т. д. Юникод — предпочтительная кодировка символов, так как она поддерживает все наборы символов и языки. Windows представляет символы юникода, используя кодировку UTF-16, в которой каждый символ кодируется как 16-разрядное значение. Символы UTF-16 называются расширенными символами, чтобы отличать их от 8-разрядных символов ANSI. Компилятор Visual C++ поддерживает встроенный тип данных WCHAR _ t для расширенных символов. Файл заголовка WinNT. h также определяет следующий typedef.

typedef wchar_t WCHAR;

Обе версии будут отображаться в примере кода MSDN. Чтобы объявить литерал расширенных символов или строковый литерал расширенных символов, добавьте L перед литералом.

wchar_t a = L'a';
wchar_t *str = L"hello";

Вот некоторые другие определения типов, связанные со строками, которые вы увидите:

Typedef Определение
CHAR char
ПСТР или LPSTR char*
Пкстр или LPCSTR const char*
Пвстр или LPWSTR wchar_t*
Пквстр или лпквстр const wchar_t*

Функции Юникода и ANSI

когда корпорация майкрософт ввела поддержку юникода для Windows, она облегчило переход, предоставляя два параллельных набора api — один для строк ANSI, а другой для строк юникода. Например, существует две функции для задания текста в строке заголовка окна:

  • Сетвиндовтекста принимает строку ANSI.
  • Сетвиндовтекств принимает строку в Юникоде.

На внутреннем уровне версия ANSI преобразует строку в Юникод. заголовки Windows также определяют макрос, который разрешается в версию юникода, если определен символ препроцессора UNICODE или если в противном случае используется версия ANSI.

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 

В библиотеке MSDN функция задокументирована под именем SetWindowText, хотя в действительности это имя макроса, а не имя самой функции.

Новые приложения всегда должны вызывать версии Юникода. Для многих языков мира требуется Юникод. Если вы используете строки ANSI, локализация приложения будет невозможно. Версии ANSI также менее эффективны, так как операционная система должна преобразовать строки ANSI в Юникод во время выполнения. В зависимости от предпочтений можно вызывать функции Юникода явным образом, например сетвиндовтекств, или использовать макросы. Пример кода в MSDN обычно вызывает макросы, но эти две формы точно эквивалентны. большинство новых интерфейсов api в Windows имеют только версию юникода, без соответствующей версии ANSI.

тчарс

когда приложения, необходимые для поддержки как Windows NT, так и Windows 95, Windows 98 и Windows мне, было полезно компилировать один и тот же код для строк ANSI или юникод в зависимости от целевой платформы. для этого Windows SDK предоставляет макросы, которые сопоставляют строки с юникодом или ANSI в зависимости от платформы.

Макрос Юникод ANSI
TCHAR wchar_t char
ТЕКСТ ("x") L"x" "x"

Например, приведенный ниже код

SetWindowText(TEXT("My Application"));

разрешается в одно из следующих:

SetWindowTextW(L"My Application"); // Unicode function with wide-character string.

SetWindowTextA("My Application");  // ANSI function.

Макросы Text и TCHAR менее полезны в настоящее время, так как все приложения должны использовать Юникод. Однако они могут отображаться в старом коде и в некоторых примерах кода MSDN.

Заголовки библиотек времени выполнения Microsoft C определяют аналогичный набор макросов. Например, _ ткслен разрешается в strlen , если _UNICODE не определен. в противном случае он разрешается в wcslen, который является версией strlen для расширенных символов.

#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 

Будьте внимательны: в некоторых заголовках используется символ препроцессора UNICODE , а другие используют _UNICODE префикс подчеркивания. Всегда определяйте оба символа. Visual C++ задает их обоими по умолчанию при создании нового проекта.

Следующий

Что такое окно?