Общие сведения о программировании Юникода
Чтобы воспользоваться поддержкой времени выполнения 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
для поддержки приложения Юникод.