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

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

typedef wchar_t WCHAR;

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

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

Ниже приведены некоторые другие связанные со строкой typedefs, которые вы увидите:

Typedef Определение
CHAR char
PSTR или LPSTR char*
PCSTR или LPCSTR const char*
PWSTR или LPWSTR wchar_t*
PCWSTR или LPCWSTR const wchar_t*

 

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

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

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

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

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

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

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

TCHARs

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

Макрос Юникод ANSI
TCHAR wchar_t char
TEXT("x") или _T("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 определяют аналогичный набор макросов. Например, _tcslen разрешается в strlen , если _UNICODE параметр не определен; в противном случае он разрешается в wcslen, который является версией strlen для расширенных символов.

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

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

Следующая

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