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

Обновлен: Ноябрь 2007

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

    dybsewaf.alert_note(ru-ru,VS.90).gifСовет.

    Макрос _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.

См. также

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

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