Поделиться через


Общие сведения о программировании Юникода

Чтобы воспользоваться преимуществами 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.

См. также

Основные понятия

Поддержка Юникода