Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 6 из 20II. Язык как инструмент115 минут

Глава 6. Строка, байты и пользовательский текст

Строка PHP хранит байты; пользователь видит графемы, протокол считает октеты, а правило поиска выбирает собственную нормализацию.

После главы вы сможете
  • различать байты и графемы
  • задавать UTF-8 boundary
  • экранировать по контексту

Одна строка — три измерения

strlen сообщает число байтов. mb_strlen с корректной кодировкой считает Unicode code points. Пользовательский символ может состоять из нескольких code points, поэтому визуальную длину измеряют grapheme-функциями Intl. Ни одна метрика не является универсально правильной.

Pulse ограничивает вход по байтам до декодирования, название события — по графемам для интерфейса, а колонку базы выбирает с учётом кодировки и индекса. Правило всегда называет единицу.

Конвейер текста

Обработка подписи событияНормализация для сравнения не уничтожает оригинальный вариант, а экранирование выполняется только на выходе.BytesUTF-8DecodevalidNormalizepurposeStoreoriginalRendercontext
Нормализация для сравнения не уничтожает оригинальный вариант, а экранирование выполняется только на выходе.

Проверка кодировки

Недопустимая UTF-8-последовательность не исправляется случайным удалением байтов. Boundary отклоняет строку или применяет документированную стратегию замены. Кодировка источника CSV задаётся явно; угадывание считается предположением и журналируется.

Регистр и сравнение зависят от языка. Простое strtolower не решает все Unicode-случаи. Для идентификаторов системы лучше ограниченный канонический алфавит, а пользовательское отображаемое имя хранит оригинал.

Нормализация по задаче

NFC или другая форма нужна, когда визуально одинаковые последовательности должны сравниваться одинаково. Но поиск, slug и криптографическая подпись имеют разные требования. Нельзя нормализовать подписываемые байты после вычисления MAC и ожидать прежний результат.

Pulse хранит raw label для отображения и отдельный search key, построенный определённой версией нормализатора. Изменение правила требует переиндексации, а не тихой смены функции.

Вывод не становится безопасным от UTF-8

Корректная кодировка не защищает от HTML-инъекции. Для текста HTML применяется htmlspecialchars с подходящими flags и UTF-8, для JSON — json_encode, для URL — компонентное кодирование. Готовая HTML-строка не переиспользуется как JavaScript.

Источник базы остаётся недоверенным при выводе: данные могли попасть туда другим маршрутом или до исправления проверки. Защита размещается в последнем контекстном boundary.

Лаборатория

Сравните байты, code points и grapheme clusters для строки с emoji и комбинируемым знаком. Затем создайте search key, сохранив исходную подпись, и выведите её как текст HTML.

  • Лимит входа указан в байтах.
  • Визуальный лимит проверяется графемами.
  • Оригинал не заменён поисковой нормализацией.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Что возвращает strlen для UTF-8 строки?
2. Когда экранировать HTML?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/language.types.string.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/book.intl.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie