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


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

Чтобы упростить преобразование кода для многоязыковых приложений, в библиотеке времени выполнения Microsoft имеются относящиеся к 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 знаков _TCHARs, а не n байтов.

Поскольку в некоторых функциях обработки строк с однобайтовой кодировкой принимаются параметры char* (со знаком), при определении символа _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

unsigned 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 (преобразование строки или знака в аналог в формате Юникод)

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

ПримечаниеПримечание

Не используйте функции семейства 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);

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

См. также

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

Текст и строками в Visual C++

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