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


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

Чтобы воспользоваться поддержкой времени выполнения MFC и C для Юникода, необходимо:

  • Определение _UNICODE.

    Определите символ _UNICODE перед сборкой программы.

  • Укажите точку входа.

    На странице "Дополнительно"папки компоновщика в диалоговом окне "Страницы свойств проекта" задайте символу входа значениеwWinMainCRTStartup.

  • Используйте переносимые функции и типы времени выполнения.

    Используйте соответствующие функции времени выполнения C для обработки строк Юникода. Вы можете использовать семейство функций wcs, но, возможно, предпочитаете полностью переносимые (на международном уровне) макросы _TCHAR. Эти макросы имеют префикс _tcs; они заменяют один к одному семейство функций str. Эти функции подробно описаны в разделе "Интернационализация" справочника по библиотеке времени выполнения. Дополнительные сведения см. в разделе "Сопоставления универсального текста" в tchar.h.

    Используйте _TCHAR и связанные переносимые типы данных, описанные в разделе "Поддержка Юникода".

  • Правильно обрабатывать литеральные строки.

    Компилятор Visual C++ интерпретирует литеральную строку, закодированную следующим образом:

    L"this is a literal string"
    

    обозначать строку символов Юникода. Для литеральных символов можно использовать один и тот же префикс. Используйте макрос _T для обработки строк литералов в универсальной форме, чтобы они компилировались как строки Unicode при использовании Unicode, или как строки ANSI (включая MBCS) при отсутствии Unicode. Например, вместо:

    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 и библиотека времени выполнения предоставляют следующую поддержку программирования Юникода:

  • За исключением функций-членов класса базы данных, все функции MFC поддерживают Unicode, включая CString. CString также предоставляет функции преобразования Юникод/ANSI.

  • Библиотека выполнения предоставляет все функции обработки строк в версиях для Юникода. (Библиотека времени выполнения также предоставляет переносимые версии, подходящие для Юникода или для MBCS. Это _tcs макросы.)

  • tchar.h предоставляет переносимые типы данных и _T макрос для преобразования строк и символов литерала. Дополнительные сведения см. в разделе "Сопоставления универсального текста" в tchar.h.

  • Библиотека времени выполнения предоставляет расширенную версию символов main. Используйте wmain для обеспечения совместимости приложения с Юникодом.

См. также

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