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


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

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

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

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

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

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

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

    Используйте соответствующие функции времени выполнения C для обработки строк Юникода. Вы можете использовать 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 и библиотека времени выполнения предоставляют следующую поддержку программирования Юникода:

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

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

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

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

См. также

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