UNICODE — стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков.
Для представления символов в этом стандарте используется 2 байта (2^5 = 65536), что позволяет закодировать очень большое количество символов из разных письменностей. Например документ может содержать русские, латинские, немецкие буквы, математические символы а так же японские и китайские иероглифы, при этом становится ненужным переключение кодовых страниц.
Операционная система Windows начиная с Windows NT реализована с использованием unicode, хотя программы запущенные в Windows NT и более поздних операционных системах семейства Windows могут работать также с однобайтовыми символами, кодировка которых соответствует установленной по умолчанию кодовой странице ANSI (например Windows Cyrillic, или CP 1251).
Использование Unicode значительно упрощает создание многоязычных приложений. Поэтому, создавая программы c использованием unicode вы закладываете неплохую основу для локализации своего программного продукта.
При написании программ вы можете выбрать с какими символами будет работать ваша программа.
Для этого существует несколько способов:
— первый способ заключается в использовании инструкции #define UNICODE
— второй актуален для пользователей Microsoft Visual Studio, которым необходимо в настройках проекта выбрать «Набор знаков». Следует отметить что по умолчанию в Microsoft Visual Studio данная опция установлена в «Использовать Unicode-кодировку».
Как уже упоминалось ранее, для хранения символа в unicode-кодировке необходимо 2 байта, когда для обычных символьных данных (символов ANSI) в языке Си используется тип char, который может хранить 1 байт.
Для решения этой проблемы Microsoft создала специальный тип для хранения unicode символов — wchar_t, с которым связаны макрокоманды WCHAR и TCHAR, описанные в файле winnt.h. При определении данных Unicode Microsoft рекомендует пользоваться макрокомандами, а не типом wchar_t.
Макрокоманда WCHAR определена:
1 | typedef wchar_t WCHAR; |
С помощью этой макрокоманды можно определить переменную, содержащую только Unicode строку.
Макрокоманда TCHAR универсальная, она позволяет определять как Unicode, так и ANSI символы. Если программа создается как Unicode, по препроцессор преобразует запись TCHAR в wchar_t, если нет, то в char.
Макрокоманда определена как:
1 2 3 4 5 6 7 8 9 10 | #ifdef UNICODE ... typedef wchar_t WCHAR; typedef WCHAR TCHAR; ... #else ... typedef char TCHAR; ... #endif |
В файле winnt.h содержатся также макрокоманды для определения указателей на символы Unicode и универсальные макрокоманды на базе TCHAR, с помощью которых можно создавать указатели на символы как ANSI, так и Unicode. Эти макрокоманды обеспечивают корректную работу при выполнении арифметических операций над указателями и при использовании указателей для индексации массивов символов Unicode.
Литеральные константы, соответствующие символам Unicode, записываются как обычные символьные константы, только с префиксом L:
Пример:
1 2 3 4 | char chStr = "*"; /* однобайтовый символ */ WCHAR chStr = L"*"; /* символ Unicode */ char szStr[] = "Str"; /* строка однобайтовых символов */ WCHAR szStr[] = L"Str"; /* строка символов Unicode */ |
Универсальная макрокоманда TEXT позволяет определять символьные константы как unicode или ANSI в зависимости от того, работает ли программа с Unicode или нет.
С помощью этой макрокоманды и макрокоманды TCHAR мы можем создавать и определять символьные переменные не заботясь о том будет ли наша программа компилироваться с поддержкой Unicode или без неё.
Макрокоманда TEXT определена как:
1 2 3 4 5 6 7 8 9 10 | #ifdef UNICODE ... #define __TEXT(quote) L##quote ... #else /* UNICODE */ ... #define __TEXT(quote) quote ... #endif /* UNICODE */ #define TEXT(quote) __TEXT(quote) |
Пример вывода Unicode строки:
1 2 3 4 5 6 7 8 | #include <windows.h> int main(int argc, TCHAR* argv[]) { TCHAR str[] = TEXT("Привет Мир!!!"); MessageBox(NULL, str, TEXT("Unicode"), MB_OK); return 0; } |
Данный пример будет без ошибок компилироваться как в Unicode, так и в ANCI версии.
Большинство функций Win32 API, получающих в качестве параметров текстовые строки или символы, реализованы как макрокоманды. В зависимости от использования unicode препроцессор подставляет вместо имени макрокоманды имя функции с суффиксом W (для Unicode) или A (для однобайтовых символов).
Рассмотрим определение макрокоманды CreateWindow:
1 2 3 4 5 | #ifdef UNICODE #define CreateWindow CreateWindowW #else #define CreateWindow CreateWindowA #endif // !UNICODE |
PS: Если у кого-то возникнет вопрос чем отличается TCHAR от _TCHAR, то скажу следующее: какой либо разницы между ними нет, TCHAR изначально определялся в заголовочных файлах Platform SDK, тогда как _TCHAR использовался в С runtime library. Какой тип вам больше нравится, тем и пользуйтесь.
0 Комментарии。