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


Универсальные текстовые сопоставления в файле Tchar.h

Обновлен: Ноябрь 2007

Чтобы упростить преобразование кода для многоязыковых приложений, в библиотеке времени выполнения Microsoft предоставляются собственные универсальные текстовые сопоставления для большинства типов данных, стандартных процедур и других объектов. Эти сопоставления определены в файле Tchar.h и могут использоваться для написания универсального кода, который можно скомпилировать в однобайтовом, многобайтовом формате или в формате Юникод (в зависимости от значения константы манифеста, определенной с помощью оператора #define). Универсальные текстовые сопоставления представляют собой расширения Microsoft, несовместимые со стандартами ANSI.

С помощью файла Tchar.h на базе одинакового исходного кода можно создавать версии приложений с поддержкой однобайтовой, многобайтовой кодировки и кодировки Юникод. В файле Tchar.h определяется макрос с префиксом _tcs, который при использовании правильных определений препроцессора обеспечивает соответствующее сопоставление с функциями str, _mbs или wcs. Чтобы построить версию приложения с многобайтовой кодировкой, определите символ _MBCS. Чтобы построить версию приложения с кодировкой Юникод, определите символ _UNICODE. Чтобы построить версию приложения с однобайтовой кодировкой, не определяйте символ (по умолчанию). В приложениях MFC по умолчанию определен символ _MBCS.

Тип данных _TCHAR определяется в файле Tchar.h условно. Если при построении определен символ _UNICODE, тип данных _TCHAR определяется как wchar_t. В противном случае (для сборок с однобайтовой и многобайтовой кодировкой) этот тип определяется как char. (Базовый тип данных wchar_t, обеспечивающий поддержку двухбайтных знаков Юникод, является 16-разрядным аналогом 8-разрядного типа char со знаком.) Для многоязыковых приложений следует использовать функции семейства _tcs, в которых используются знаки _TCHAR, а не байты. Например, с помощью функции _tcsncpy выполняется копирование n знаков _TCHAR, а не n байтов.

Поскольку в некоторых функциях обработки строк с однобайтовой кодировкой принимаются параметры char* (signed или unsigned), при определении символа _MBCS отображается предупреждение компилятора о несоответствии типов. Ниже приведены три способа устранения этой ошибки (в порядке убывания эффективности):

  1. Использование встроенных строго типизированных преобразователей функций, содержащихся в файле Tchar.h. Это поведение установлено по умолчанию.

  2. Использование макроса перехода, содержащегося в файле Tchar.h, посредством определения символа _MB_MAP_DIRECT в командной строке. В этом случае необходимо выполнить сопоставление типов вручную. Этот способ является наиболее быстрым, однако не обеспечивает строгую типизацию.

  3. Использование встроенных преобразователей функций статической библиотеки, содержащихся в файле Tchar.h. Определите в командной строке константу _NO_INLINING. Этот способ является наиболее медленным, однако обеспечивает строгую типизацию.

Директивы препроцессора для универсальных текстовых сопоставлений

# define

Скомпилированная версия

Пример

_UNICODE

Юникод (двухбайтные знаки)

_tcsrev сопоставляется функции _wcsrev

_MBCS

Многобайтовая кодировка

_tcsrev сопоставляется функции _mbsrev

Нет (по умолчанию, не определен ни символ _UNICODE, ни символ _MBCS)

Однобайтовая кодировка (ASCII)

_tcsrev сопоставляется функции strrev

Например, определенная в файле Tchar.h универсальная текстовая функция _tcsrev сопоставляется функции _mbsrev (если в программе определен символ _MBCS) или функции _wcsrev (если определен символ _UNICODE). В противном случае _tcsrev сопоставляется функции strrev. Для удобства в файле Tchar.h также предусмотрены другие сопоставления типов данных, однако _TCHAR является наиболее эффективным из них.

Универсальные текстовые сопоставления типов данных

Имя универсального

текстового типа данных

Символы _UNICODE и

_MBCS не определены

Символ _MBCS

определен

Символ _UNICODE

определен

_TCHAR

char

char

wchar_t

_TINT

int

int

wint_t

_TSCHAR

signed char

signed char

wchar_t

_TUCHAR

unsigned char

unsigned char

wchar_t

_TXCHAR

char

unsigned char

wchar_t

_T или _TEXT

Не действует (удаляется препроцессором)

Не действует (удаляется препроцессором)

L (преобразование строки или знака в аналог в формате Юникод)

Полный список универсальных текстовых сопоставлений стандартных процедур, переменных и других объектов см. в разделе Универсальные текстовые сопоставления в справочнике по библиотеке времени выполнения.

c426s321.alert_note(ru-ru,VS.90).gifПримечание.

Не используйте функции семейства str для строк в формате Юникод, поскольку в них скорее всего содержатся встроенные пустые байты. По тем же причинам не следует использовать функции семейства wcs для строк с однобайтовой или многобайтовой кодировкой.

В следующих примерах кода описывается порядок использования функций _TCHAR и _tcsrev для сопоставления моделям однобайтовой, многобайтовой кодировки и кодировки Юникод.

_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);

Если определен символ _MBCS, препроцессор сопоставляет этот фрагмент следующему коду:

char *RetVal, *szString;
RetVal = _mbsrev(szString);

Если определен символ _UNICODE, препроцессор сопоставляет этот фрагмент следующему коду:

wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);

Если не определен ни символ _MBCS, ни символ _UNICODE, препроцессор сопоставляет этот фрагмент однобайтовому коду ASCII:

char *RetVal, *szString;
RetVal = strrev(szString);

Таким образом, можно создавать, обслуживать и компилировать единый исходный файл кода, который будет выполняться с процедурами, использующими любую из трех описанных выше кодировок.

См. также

Основные понятия

Поддержка кодировок в С++

Использование типов данных TCHAR.H с кодом _MBCS