Подсчёт символов UTF-8 без путаницы с байтами
Для большинства текстовых ограничений используйте mb_strlen($text, 'UTF-8'); для пользовательских графем — grapheme_strlen().
mb_strlen($text, 'UTF-8')Готовый вариант
<?php
function textLength(string $text): int {
return mb_strlen($text, 'UTF-8');
}Что считается
mb_strlen() считает кодовые точки выбранной кодировки. Символ с комбинируемым акцентом и некоторые эмодзи могут визуально быть одним знаком, но состоять из нескольких кодовых точек.
Графемы
Если ограничение должно совпадать с пользовательским восприятием, применяйте grapheme_strlen() из Intl. Сначала проверьте наличие функции и зафиксируйте поведение fallback.
Проверка результата
Добавьте тесты для ASCII, кириллицы, пустой строки, emoji и последовательности с combining mark. Не используйте один случай «Привет» как доказательство корректности для всего Unicode.
Когда не подходит
Для размера HTTP-тела, бинарного протокола и ограничения столбца в байтах нужен strlen(), а не подсчёт символов.
Связанные материалы
Источники и проверка
- PHP Documentation Group — структурный источник, без внешней ссылки
- PHP Documentation Group — структурный источник, без внешней ссылки
Последняя содержательная проверка: . Автор-разработчик Михаил Каржин. Методика качества контента.