Символьные типы

b

Введение в символьные типы Delphi

В среде разработки Delphi символьные типы являются фундаментальными строительными блоками для работы с текстом. В 2026 году, с учетом перехода на 64-разрядные компиляторы и полную поддержку Unicode, выбор правильного символьного типа определяет производительность, совместимость с внешними библиотеками и объем потребляемой памяти. Данный материал рассматривает технические аспекты каждого типа, их внутреннее устройство и критерии выбора.

Основной тип Char

Начиная с Delphi 2009, тип Char (синоним WideChar) занимает 2 байта (16 бит) и хранит символы в кодировке UTF-16. Технические характеристики:

Качество реализации: внутренняя таблица символов соответствует стандарту ISO/IEC 10646. В отличие от AnsiChar, не требуется перекодировка при работе с системными функциями Windows (которые также используют UTF-16).

AnsiChar — для обратной совместимости

Тип AnsiChar занимает 1 байт (8 бит) и представляет символы однобайтовой кодовой страницы. Технические детали:

Спецификации применения:

  1. Используется только для совместимости с легаси-кодом или внешними библиотеками (например, C/C++ DLL, работающими с char).
  2. Материалы по оптимизации: операции с AnsiChar выполняются быстрее за счет меньшего размера, но риск потери данных при конвертации из UTF-16 превышает выгоду.
  3. Контроль качества: при смешивании типов необходим явный вызов функций AnsiChar() или WideChar() для избежания неявного преобразования.
  4. WideChar и сходство с Char

    Технически WideChar и Char — идентичные суррогаты. Однако фрагмент кода с явным указанием WideChar явно документирует намерение работать с многобайтовой кодировкой. Отличия от альтернатив:

    • По сравнению с C++ wchar_t: в Delphi WideChar всегда 2 байта (в C++ размер зависит от платформы).
    • По сравнению с Java char: идентичен по размеру и кодировке.
    • По сравнению с C# char: полная совместимость при P/Invoke вызовах.

    WideChar и суррогатные пары

    Важный технический нюанс: тип WideChar (2 байта) не может хранить символы вне базовой плоскости Unicode (например, эмодзи или редкие иероглифы). Такие символы представляются двумя WideChar (суррогатная пара). Спецификация обработки:

    1. Функция HighSurrogate(Char) и LowSurrogate(Char) позволяют проверить, является ли символ частью суррогатной пары.
    2. Для работы со строками, содержащими эмодзи, необходимо использовать функции UnicodeString, а не посимвольную обработку через массив Char.
    3. Метрики качества: правильная поддержка суррогатных пар — критерий корректной работы с глобализированным текстом.

    PChar — указатель на символьный массив

    Тип PChar (синоним PWideChar) — это указатель на первый элемент массива WideChar. Технические спецификации:

    • Размер указателя: 4 байта для 32-битных сборок, 8 байт для 64-битных.
    • Null-терминированная строка: конец строки обозначается символом #0.
    • Применение: взаимодействие с API Windows, работа с буферами фиксированной длины.

    Отличия от альтернатив:

    • В отличие от String, PChar не управляется автоматически — требуется ручное управление памятью или копирование через StrPCopy/PCharBuffer.
    • В отличие от нуль-терминированных строк C, в Delphi не требуется завершать строку нулем при использовании String (он встроен автоматически).

    Материалы и рекомендации по качеству

    При выборе символьного типа в 2026 году руководствуйтесь следующими правилами:

    • Char (WideChar) — стандартный выбор для всех новых проектов.
    • AnsiChar — только если требуется совместимость с конкретным API, ожидающим однобайтовые данные.
    • PChar — исключительно для прямых вызовов Windows API без посредников.

    Контрольные точки для верификации:

    1. Проверка на неявное расширение/сужение типов с помощью директивы {$WARN IMPLICIT_STRING_CAST ON}.
    2. Использование SizeOf(Char) для динамического определения размера в коде (полезно при переносе между версиями Delphi).
    3. Тестирование на строках с символами >#127 для выявления ошибок кодировки.

    Добавлено: 27.04.2026