Использование универсальных типов данных
Если в коде используются универсальные типы данных, его можно скомпилировать для Юникода с помощью директивы препроцессора для определения «UNICODE» перед #include директивами для файлов заголовков. Чтобы скомпилировать код для кодовой страницы Windows (ANSI), опустите определение ЮНИКОД. Новые приложения Windows должны использовать Юникод, чтобы избежать несоответствий различных кодовых страниц и упростить локализацию.
Чтобы создать исходный код, который можно скомпилировать либо для использования символов и строк Юникода, либо для использования символов и строк на кодовых страницах Windows:
Используйте универсальные типы данных, такие как TCHAR, LPTSTR и LPTCH, для всех типов символов и строк, используемых для текста. Дополнительную информацию об универсальных типах см. в типах данных Windows для строк.
Убедитесь, что указатели на буферы нетекстовых данных или двоичные массивы байтов кодируются типами данных, такими как LPBYTE или LPWORD, а не типа LPTSTR или LPTCH.
Объявляйте указатели неопределенного типа явным образом в качестве указателей void с помощью LPVOID, где это уместно.
Сделайте арифметику указателей независимой от типа. При использовании единиц размера TCHAR переменные имеют размер 2 байта, если определён UNICODE, и 1 байт, если UNICODE не определён. При использовании арифметики указателя всегда возвращается количество элементов, указанных указателем, будь то элементы размером 1 или 2 байта. Следующее выражение всегда извлекает количество элементов независимо от того, определен ли ЮНИКОД.
cCount = lpEnd - lpStart;
Следующее выражение определяет количество используемых байтов.
cByteCount = (lpEnd - lpStart) * sizeof(TCHAR);
Изменить оператор, как показано ниже, не требуется, так как указатель увеличивается на следующий символ.
chNext = *++lpText;
Замените литеральные строки и константы символов манифеста макросами. Измените выражения, как показано ниже.
while(*lpFileName++ != '\\') { // ... }
Используйте макрос TEXT следующим образом в этом выражении.
while(*lpFileName++ != TEXT('\\')) { // ... }
Макрос TEXT приводит к вычислению строк как L"string" при определении ЮНИКОД и как "string" в противном случае. Чтобы упростить управление, переместите литеральные строки в ресурсы, особенно если они содержат символы за пределами диапазона ASCII (0x00 через 0x7F) или предоставляются в пользовательском интерфейсе. Для поддержки локализации приложения для разных национальных языков очень важно, чтобы все строки пользовательского интерфейса были локализованными ресурсами.
Используйте универсальные версии функций Windows. Дополнительные сведения см. в соглашениях о прототипах функций.
Используйте универсальные версии стандартных строковых функций библиотеки C и не забудьте определить "_UNICODE", а также "ЮНИКОД", как описано в стандартных функций C.
Если вы адаптируете приложение, первоначально написанное для кодовой страницы Windows, не забудьте изменить любой код, основанный на 255 в качестве наибольшего значения для символа.
При компиляции кода, написанного как описано выше, компилятор может создавать версии кодовой страницы Юникода и Windows из одного источника. В зависимости от определений Юникода универсальные функции обрабатываются для получения одинаковых двоичных файлов, как если бы вы написали код исключительно для Юникода или исключительно для кодовых страниц Windows.
Связанные разделы