Когда-нибудь видели на сайтах предупреждение: «Длина сообщения не более…» например, 500 символов? Начинаешь писать, честно укладываешься в 450 символов, а при отправке получаешь отлуп: слишком длинное сообщение…
Если вы догадаетесь сократить сообщение до 250 символов или использовать транслит, сообщение всё-таки удастся отправить, но остаётся желание кого-то взять за грудки и сказать: что ж ты, милый, людям голову-то морочишь?!..
На самом деле это означает, что «на той стороне» сидит несведущий вебмастер. Может, он иностранец и не знает, что такое кириллица, а может, из наших палестин недоучка. Причина такого расхождения в обещанной и реальной длине — размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских. Php-шная функция strlen считает длину строки в байтах, а не в буквах, и если буква занимает два байта, она засчитывается за две.
Ну хорошо, чужие сайты мы улучшить не можем, а как не делать такой ошибки у себя? Используем функцию iconv_strlen, и не забываем указывать кодировку. Итого:
/*считаем длину строки*/ $strLength = iconv_strlen('а вот тут наша строчка', 'UTF-8');
Кодировка — главный «крекс-пэкс-фэкс» функции, без него эффекта не будет.
Другой случай, когда разница между strlen и iconv_strlen оказывается существенной — обрезка строки до нужной длины. Strlen не только уменьшает вдвое число кириллических символов, но может также разрезать последний из них пополам. Если на странице сайта вы видите нечто вроде «А это анонс нашей замечательной стат?», это, скорее всего, тот самый случай. Когда такое вылезает в читаемом тексте — полбеды, но если таким образом выведется переменная в код скрипта, последствия могут быть очень неприятными — вплоть до полной визуальной гибели той части страницы, что идёт после «крамольного» участка. Функция iconv_strlen избавит нас от подобных неприятностей. Скажем ей за это спасибо.
29 комментариев на «Php: правильно считаем количество символов в строке»
Иван (2 комментария)
А я обычно использую функцию mb_strlen($str,’UTF-8′)
Княгиня (660 комментариев)
Тоже вариант. Просто я исторически с iconv_strlen познакомилась раньше.
Дмитрий (3 комментария)
А в джаваскриптах какой аналог mb_strlen или iconv_strlen? Я помню там тоже какая то заморочка с кириллицей присутствует.
Княгиня (660 комментариев)
В джаваскрипте я таких проблем не встречала. Там длина считается методом length.
Антон (2 комментария)
В js заморочек с UTF-8 нет, так как он изначально поддерживает его. А вот с другими кодировками могут быть проблемы:)
str_len работает только с однобайтовыми кодировками, а iconv и mb_string функции с многобайтовыми, т.е. поддерживают utf8 и др. Отсюда и путаница. В связи с тем, что компьютерная индустрия зародилась на западе, все ASCII символы в любой кодировке отображаются одинаково. Есть хорошие статьи на эту тему на википедии. Советую.
Сергей (1 комментарий)
Спасибо, Функция iconv_strlen.
Катя (1 комментарий)
Тоже mb_strlen использую. Ох уж этот UTF-8.
Толя (блог uaplus) (1 комментарий)
В большинстве php-фреймворков есть готовые функции для работы с utf8-строками. Я пользуюсь Kohana, там есть utf8::strlen()
хотя конечно в конце-концов все сводится к mb_strlen()
globalone (2 комментария)
Полезно. Буду знать. Не раз встречал такие казусы на блогах. Честно говоря очень сильно раздражает. Думаешь, пишешь, стараешься, а тебе облом.
Александр (9 комментариев)
В общем то с таким встречался только в мобилке, да у нас ещё в интернете казусов и непонятки очень много.Есть очень много мелочей которые как бы не лежат на поверхности и ни кто о них не вспоминает, до поры до времени.Спасибо за информацию, думаю теперь перед другими есть чем похвастаться.