Использование UNICODE

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. Какой тип вам больше нравится, тем и пользуйтесь.

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>