Общие сведения о программировании Юникода
Чтобы воспользоваться преимуществами MFC и библиотеки времени выполнения языка C для Юникода, требуется:
Определить _UNICODE.
Определить символ _UNICODE перед построением программы.
Указать точку входа.
На странице Выходные данные папки "Компоновщик" в диалоговом окне Страницы свойств проекта задать символ точки входа wWinMainCRTStartup.
Использовать переносимые функции времени выполнения и типы.
Использовать подходящие функции библиотеки времени выполнения языка С для обработки строк Юникода.Можно использовать семейство функций wcs, но предпочтительнее использовать полностью переносимый (международно применимый) макрос _TCHAR.Данные макросы начинаются с префикса _tcs. Они однозначно заменяют семейство функций str.Данные функции подробно описаны в подразделе Интернационализация раздела Справка по библиотеке времени выполнения.Дополнительные сведения см. в разделе Универсальные текстовые соответствия в файле Tchar.h.
Используйте _TCHAR и связанные переносимые типы данных, описанные в разделе Поддержка Юникода.
Правильно обрабатывать строковые литералы.
Компилятор Visual C++ интерпретирует код строковых литералов как:
L"this is a literal string"
обозначая таким образом строку символов Юникод.Этот префикс можно использовать для строковых литералов.Используйте макрос _T для кодирования строковых литералов в общем случае, т.к. они компилируются как строки Юникода в Юникод или как строки ANSI (включая многобайтовую кодировку MBCS) без Юникода.Например, вместо
pWnd->SetWindowText( "Hello" );
используйте
pWnd->SetWindowText( _T("Hello") );
Если определен _UNICODE, то _T транслирует строковые литералы в представление с префиксом "L". В противном случае _T транслирует строку без префикса "L".
Совет Макрос _T идентичен макросу _TEXT.
Будьте внимательны при передаче длинных строк в качестве аргументов функции.
Некоторым функциям требуется в качестве аргумента число символов в строке, а другим число байтов.Например, если определен _UNICODE, то следующий вызов объекта CArchive не будет выполнен (str является CString):
archive.Write( str, str.GetLength( ) ); // invalid
В приложении Юникод длина означает число символов, а не число байт, т.к. каждый символ занимает 2 байта.Поэтому необходимо использовать следующую конструкцию:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
которая указывает правильное число записываемых байтов.
Однако функции-члены MFC, ориентированные на работу с символами, а не с байтами, работают без дополнительного кодирования:
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut берет число символов, а не число байтов.
Чтобы открыть файлы Юникода, используйте функции fopen_s, _wfopen_s.
Подводя итоги, можно сказать, что MFC и библиотека времени выполнения предоставляет следующую поддержку программирования Юникода в Windows 2000:
За исключением функций-членов класса базы данных все функции MFC поддерживают Юникод, включая CString.CString также предоставляет функции преобразования Юникода или ANSI.
Библиотека времени выполнения предоставляет версии Юникода для всех функций обработки строк.(Библиотека времени выполнения также предоставляет переносимые версии, подходящие для Юникода или для многобайтовой кодировки (MBCS).Используется макрос _tcs).
Tchar.h предоставляет переносимые типы данных и макрос _T для трансляции символьных констант и знаков.Дополнительные сведения см. в разделе Универсальные текстовые соответствия в файле Tchar.h.
Библиотека времени выполнения предоставляет двухбайтовую версию функции main.Чтобы сделать приложение Юникод совместимым, используйте функцию wmain.