Php: правильно считаем количество символов в строке

23 апреля 2012. Рубрики: Рабочие заметки; автор — Юлия Панина aka Княгиня.

Когда-нибудь видели на сайтах предупреждение: «Длина сообщения не более…» например, 500 символов? Начинаешь писать, честно укладываешься в 450 символов, а при отправке получаешь отлуп: слишком длинное сообщение…

Если вы догадаетесь сократить сообщение до 250 символов или использовать транслит, сообщение всё-таки удастся отправить, но остаётся желание кого-то взять за грудки и сказать: что ж ты, милый, людям голову-то морочишь?!..

На самом деле это означает, что «на той стороне» сидит несведущий вебмастер. Может, он иностранец и не знает, что такое кириллица, а может, из наших палестин недоучка. Причина такого расхождения в обещанной и реальной длине — размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских. Php-шная функция strlen считает длину строки в байтах, а не в буквах, и если буква занимает два байта, она засчитывается за две.

Ну хорошо, чужие сайты мы улучшить не можем, а как не делать такой ошибки у себя? Используем функцию iconv_strlen, и не забываем указывать кодировку. Итого:

/*считаем длину строки*/
$strLength = iconv_strlen('а вот тут наша строчка', 'UTF-8');

Кодировка — главный «крекс-пэкс-фэкс» функции, без него эффекта не будет.

Другой случай, когда разница между strlen и iconv_strlen оказывается существенной — обрезка строки до нужной длины. Strlen не только уменьшает вдвое число кириллических символов, но может также разрезать последний из них пополам. Если на странице сайта вы видите нечто вроде «А это анонс нашей замечательной стат?», это, скорее всего, тот самый случай. Когда такое вылезает в читаемом тексте — полбеды, но если таким образом выведется переменная в код скрипта, последствия могут быть очень неприятными — вплоть до полной визуальной гибели той части страницы, что идёт после «крамольного» участка. Функция iconv_strlen избавит нас от подобных неприятностей. Скажем ей за это спасибо. 🙂

Отзывы (28) на «Php: правильно считаем количество символов в строке»
  1. Иван (2 комментария)

    А я обычно использую функцию mb_strlen($str,’UTF-8′)

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

      Тоже вариант. =) Просто я исторически с iconv_strlen познакомилась раньше.

      Ответить на этот комментарий
  2. Дмитрий (3 комментария)

    А в джаваскриптах какой аналог mb_strlen или iconv_strlen? Я помню там тоже какая то заморочка с кириллицей присутствует.

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

      В джаваскрипте я таких проблем не встречала. Там длина считается методом length.

      Ответить на этот комментарий
    • Антон (2 комментария)

      В js заморочек с UTF-8 нет, так как он изначально поддерживает его. А вот с другими кодировками могут быть проблемы:)
      str_len работает только с однобайтовыми кодировками, а iconv и mb_string функции с многобайтовыми, т.е. поддерживают utf8 и др. Отсюда и путаница. В связи с тем, что компьютерная индустрия зародилась на западе, все ASCII символы в любой кодировке отображаются одинаково. Есть хорошие статьи на эту тему на википедии. Советую.

      Ответить на этот комментарий
  3. Сергей (1 комментарий)

    Спасибо, Функция iconv_strlen. :-D

    Ответить на этот комментарий
  4. Катя (1 комментарий)

    Тоже mb_strlen использую. Ох уж этот UTF-8.

    Ответить на этот комментарий
  5. Толя (блог uaplus) (1 комментарий)

    В большинстве php-фреймворков есть готовые функции для работы с utf8-строками. Я пользуюсь Kohana, там есть utf8::strlen()
    хотя конечно в конце-концов все сводится к mb_strlen() :)

    Ответить на этот комментарий
  6. globalone (2 комментария)

    Полезно. Буду знать. Не раз встречал такие казусы на блогах. Честно говоря очень сильно раздражает. Думаешь, пишешь, стараешься, а тебе облом.

    Ответить на этот комментарий
  7. Александр (9 комментариев)

    В общем то с таким встречался только в мобилке, да у нас ещё в интернете казусов и непонятки очень много.Есть очень много мелочей которые как бы не лежат на поверхности и ни кто о них не вспоминает, до поры до времени.Спасибо за информацию, думаю теперь перед другими есть чем похвастаться.

    Ответить на этот комментарий

Есть что сказать? Не молчим!

Используйте теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" code=""> <ul> <li> <ol> .

Комментарии короче 200 символов публикуются без активной ссылки. Пробелы не учитываются.

Ссылки с комментариев dofollow. Ознакомьтесь, пожалуйста, с правилами dofollow-комментирования. Кто не читает, тот сам себе враг.