Одна строка — три измерения
strlen сообщает число байтов. mb_strlen с корректной кодировкой считает Unicode code points. Пользовательский символ может состоять из нескольких code points, поэтому визуальную длину измеряют grapheme-функциями Intl. Ни одна метрика не является универсально правильной.
Pulse ограничивает вход по байтам до декодирования, название события — по графемам для интерфейса, а колонку базы выбирает с учётом кодировки и индекса. Правило всегда называет единицу.
Конвейер текста
Проверка кодировки
Недопустимая 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 этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/language.types.string.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/book.intl.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .