Поделиться через


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

В этом разделе объясняется, как Windows поддерживает строки Юникода для элементов пользовательского интерфейса, имен файлов и т. д. (Кодировка Юникода является предпочтительной кодировкой символов, так как она поддерживает все наборы символов и языки).

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

typedef wchar_t WCHAR;

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

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

В следующей таблице перечислены некоторые другие строковые типдефы:

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 

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

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

TCHAR

В некоторых случаях может потребоваться компилировать один и тот же код для строк ANSI или Юникода в зависимости от целевой платформы. В этом случае пакет SDK для Windows предоставляет макросы, которые сопоставляют строки с Юникодом или ANSI в зависимости от платформы.

Макрос Unicode 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 сегодня менее полезны, так как все приложения должны использовать Юникод.

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

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

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

Следующий

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