Окт 14

Unicode

Работа с разными кодировками, особенно многобайтными, доставляет программисту немало сложностей, например, в случае преобразования символов из одной кодировки в другую. Для решения подобных проблем был предложен стандарт Unicode. В Консорциум Unicode, осуществляющий сопровождение данного стандарта, входят Apple, Hewlett-Packard, IBM, Microsoft, Sun и другие компании. В этом стандарте каждый символ кодируется двумя байтами, что обеспечивает возможность выражения до 65 536 символов. Стандарт Unicode позволяет представить большую часть символов практически всех языков мира.
Символы в стандарте Unicode группируются в логические зоны. Например, в первой зоне содержатся символы с кодами от 0x0000 до 0x007F, и младшие байты этих кодов повторяют таблицу ASCII. Самая большая зона содержит 29 902 иероглифов, используемых в Китае, Японии и Корее.
Windows поддерживает работу с символами как в традиционной ANSI-кодировке, так и в кодировке Unicode. Почти все функции Win32 API, получающие в качестве аргумента адрес строки, имеют ANSI- и Unicode-версии.
При соблюдении небольшого количества правил вы можете написать программу так, что она будет компилироваться как в ANSI-версии, так и в Unicode-версии.
Если в начале файла имеется директива #define UNICODE, то компилятор создает Unicode-версию, если такой директивы нет — ANSI-версию. Разумеется, в многофайловом проекте эта директива должна одновременно присутствовать или отсутствовать во всех файлах проекта.
Вот эти правила:
Для определения символов и строк вместо типа char используйте тип TCHAR, вместо типа char используйте тип LPTSTR, вместо типа const char — тип LPCTSTR.
Для определения строковых констант используйте макрос TEXT, то есть вместо нотации "abed" употребляйте нотацию TEXT("abcd").
В случае использования функций из С-библиотеки, работающих со строками, предусмотрите вызов нужной версии функции. Для этого нужно добавить в начале файла, но после директивы #define UNICODE, директивы условной компиляции, подобные следующим инструкциям:
#ifdef UNICODE
fdefine sprintf swprintf
fdefine sscanf swscanf
fdefine strcpy wesepy
fdefine strcat wescat
fdefine strlen wcslen fendif