Универсальные текстовые сопоставления в файле 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 отображается предупреждение компилятора о несоответствии типов. Ниже приведены три способа устранения этой ошибки (в порядке убывания эффективности):
Использование встроенных строго типизированных преобразователей функций, содержащихся в файле Tchar.h. Это поведение установлено по умолчанию.
Использование макроса перехода, содержащегося в файле Tchar.h, посредством определения символа _MB_MAP_DIRECT в командной строке. В этом случае необходимо выполнить сопоставление типов вручную. Этот способ является наиболее быстрым, однако не обеспечивает строгую типизацию.
Использование встроенных преобразователей функций статической библиотеки, содержащихся в файле 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 (преобразование строки или знака в аналог в формате Юникод) |
Полный список универсальных текстовых сопоставлений стандартных процедур, переменных и других объектов см. в разделе Универсальные текстовые сопоставления в справочнике по библиотеке времени выполнения.
Примечание. |
---|
Не используйте функции семейства 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);
Таким образом, можно создавать, обслуживать и компилировать единый исходный файл кода, который будет выполняться с процедурами, использующими любую из трех описанных выше кодировок.