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


Использование универсальных типов данных

Если в коде используются универсальные типы данных, его можно скомпилировать для Юникода с помощью директивы препроцессора для определения «UNICODE» перед #include директивами для файлов заголовков. Чтобы скомпилировать код для кодовой страницы Windows (ANSI), опустите определение ЮНИКОД. Новые приложения Windows должны использовать Юникод, чтобы избежать несоответствий различных кодовых страниц и упростить локализацию.

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

  1. Используйте универсальные типы данных, такие как TCHAR, LPTSTR и LPTCH, для всех типов символов и строк, используемых для текста. Дополнительную информацию об универсальных типах см. в типах данных Windows для строк.

  2. Убедитесь, что указатели на буферы нетекстовых данных или двоичные массивы байтов кодируются типами данных, такими как LPBYTE или LPWORD, а не типа LPTSTR или LPTCH.

  3. Объявляйте указатели неопределенного типа явным образом в качестве указателей void с помощью LPVOID, где это уместно.

  4. Сделайте арифметику указателей независимой от типа. При использовании единиц размера TCHAR переменные имеют размер 2 байта, если определён UNICODE, и 1 байт, если UNICODE не определён. При использовании арифметики указателя всегда возвращается количество элементов, указанных указателем, будь то элементы размером 1 или 2 байта. Следующее выражение всегда извлекает количество элементов независимо от того, определен ли ЮНИКОД.

    cCount = lpEnd - lpStart;
    

    Следующее выражение определяет количество используемых байтов.

    cByteCount = (lpEnd - lpStart) * sizeof(TCHAR);
    

    Изменить оператор, как показано ниже, не требуется, так как указатель увеличивается на следующий символ.

    chNext = *++lpText;
    
  5. Замените литеральные строки и константы символов манифеста макросами. Измените выражения, как показано ниже.

    while(*lpFileName++ != '\\')
    {
        // ...
    }
    

    Используйте макрос TEXT следующим образом в этом выражении.

    while(*lpFileName++ != TEXT('\\'))
    {
        // ...
    }
    

    Макрос TEXT приводит к вычислению строк как L"string" при определении ЮНИКОД и как "string" в противном случае. Чтобы упростить управление, переместите литеральные строки в ресурсы, особенно если они содержат символы за пределами диапазона ASCII (0x00 через 0x7F) или предоставляются в пользовательском интерфейсе. Для поддержки локализации приложения для разных национальных языков очень важно, чтобы все строки пользовательского интерфейса были локализованными ресурсами.

  6. Используйте универсальные версии функций Windows. Дополнительные сведения см. в соглашениях о прототипах функций.

  7. Используйте универсальные версии стандартных строковых функций библиотеки C и не забудьте определить "_UNICODE", а также "ЮНИКОД", как описано в стандартных функций C.

  8. Если вы адаптируете приложение, первоначально написанное для кодовой страницы Windows, не забудьте изменить любой код, основанный на 255 в качестве наибольшего значения для символа.

При компиляции кода, написанного как описано выше, компилятор может создавать версии кодовой страницы Юникода и Windows из одного источника. В зависимости от определений Юникода универсальные функции обрабатываются для получения одинаковых двоичных файлов, как если бы вы написали код исключительно для Юникода или исключительно для кодовых страниц Windows.

Использование Юникода и наборов символов