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

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

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

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

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

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

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

    cCount = lpEnd - lpStart;
    

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

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

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

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

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

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

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

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

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

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

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

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

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