Когда-нибудь видели на сайтах предупреждение: «Длина сообщения не более…» например, 500 символов? Начинаешь писать, честно укладываешься в 450 символов, а при отправке получаешь отлуп: слишком длинное сообщение…
Если вы догадаетесь сократить сообщение до 250 символов или использовать транслит, сообщение всё-таки удастся отправить, но остаётся желание кого-то взять за грудки и сказать: что ж ты, милый, людям голову-то морочишь?!..
На самом деле это означает, что «на той стороне» сидит несведущий вебмастер. Может, он иностранец и не знает, что такое кириллица, а может, из наших палестин недоучка. Причина такого расхождения в обещанной и реальной длине — размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских. Php-шная функция strlen считает длину строки в байтах, а не в буквах, и если буква занимает два байта, она засчитывается за две.
Ну хорошо, чужие сайты мы улучшить не можем, а как не делать такой ошибки у себя? Используем функцию iconv_strlen, и не забываем указывать кодировку. Итого:
/*считаем длину строки*/
$strLength = iconv_strlen('а вот тут наша строчка', 'UTF-8');
Кодировка — главный «крекс-пэкс-фэкс» функции, без него эффекта не будет.
Другой случай, когда разница между strlen и iconv_strlen оказывается существенной — обрезка строки до нужной длины. Strlen не только уменьшает вдвое число кириллических символов, но может также разрезать последний из них пополам. Если на странице сайта вы видите нечто вроде «А это анонс нашей замечательной стат?», это, скорее всего, тот самый случай. Когда такое вылезает в читаемом тексте — полбеды, но если таким образом выведется переменная в код скрипта, последствия могут быть очень неприятными — вплоть до полной визуальной гибели той части страницы, что идёт после «крамольного» участка. Функция iconv_strlen избавит нас от подобных неприятностей. Скажем ей за это спасибо. 🙂