Функция substr() работает некорректно в кодировке UTF-8 (PHP)

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Функция substr() работает некорректно в кодировке UTF-8 (PHP)

Сообщение Slash » Пн ноя 02, 2015 7:37 pm

Здравствуйте.
Столкнулся с такой проблемой, что функция substr() некорректно работает в UTF-8 кодировке. В конце обрезанной строки появлялся знак вопроса - �.
Нашел простое решение этой проблемы! На помощь пришла функция mb_substr(). Предназначение данной функции - получить часть строки, что собственно мне и надо. Мне необходимо "выхватить" первые 125 символов, например из переменной $text, значит делаю так:

Код: Выделить всё

$text = mb_substr($text, 0, 125, 'utf-8');

Теперь обрезанная строка выглядит без всяких отклонений.

Спасибо за внимание.
Реклама
cefp
Сообщения: 333
Поблагодарили: 3 раза

Re: Функция substr() работает некорректно в кодировке UTF-8 (PHP)

Сообщение cefp » Вт ноя 03, 2015 2:44 pm

У меня такая же проблема была с этой функцией. Проблему решил удалением одного пробела в коде. Было:

Код: Выделить всё

if( ( utf8_strlen( $sMetaDescription )> 195 )&& ( $iSpace= utf8_strpos( $sMetaDescription, ' ', 195 ) )!== FALSE ) $sMetaDescription= substr( $sMetaDescription, 0, $iSpace ).'...';

Стало:

Код: Выделить всё

if ((utf8_strlen($sMetaDescription)> 195 )&& ( $iSpace= utf8_strpos( $sMetaDescription, ' ', 195 ) )!== FALSE ) $sMetaDescription = substr($sMetaDescription, 0, $iSpace).'...';

Исправил только вчера.

Добавлено спустя 2 минуты 13 секунд:
Slash писал(а):функция substr() некорректно работает в UTF-8 кодировке

У Вас случайно не сохранился нерабочий код?
d o h o d - s - n u l y a .ru - идеи бизнеса.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Функция substr() работает некорректно в кодировке UTF-8 (PHP)

Сообщение Slash » Вт ноя 03, 2015 4:55 pm

cefp, от куда Ваш код?
cefp писал(а):У Вас случайно не сохранился нерабочий код?

Нет, но если надо могу показать. В первом посте код приведен для примера, вот оригинал:

Код: Выделить всё

            'description' => '<meta name="description" content="' . substr(strip_tags($report['article_text']), 0, 150) . '" />'

заменил на:

Код: Выделить всё

            'description' => '<meta name="description" content="' . mb_substr(strip_tags($report['article_text']), 0, 150, 'utf-8') . '" />'
cefp
Сообщения: 333
Поблагодарили: 3 раза

Re: Функция substr() работает некорректно в кодировке UTF-8 (PHP)

Сообщение cefp » Чт ноя 12, 2015 8:39 pm

Это мод для создания твиттеркард в phpbb3.0
Сейчас заметил, что ошибка осталась.
Решил воспользоваться Вашим решением, получилось так:

Код: Выделить всё

   if ((utf8_strlen($sMetaDescription)> 195 )&& ( $iSpace= utf8_strpos( $sMetaDescription, ' ', 195 ) )!== FALSE ) $sMetaDescription = mb_substr($sMetaDescription, 0, $iSpace, 'utf-8').'..';

Рабатает 8-)
d o h o d - s - n u l y a .ru - идеи бизнеса.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Функция substr() работает некорректно в кодировке UTF-8 (PHP)

Сообщение Slash » Чт ноя 12, 2015 9:43 pm

cefp писал(а):phpbb3.0

Думаю если соблюдать стандарты phpbb, то так будет корректнее (BSD стиль):

Код: Выделить всё

   if ((utf8_strlen($sMetaDescription) > 195) && ($iSpace = utf8_strpos($sMetaDescription, ' ', 195)) !== false)
   {
       $sMetaDescription = mb_substr($sMetaDescription, 0, $iSpace, 'utf-8') . '..';
   }

Ещё вариант, в одну строчку:

Код: Выделить всё

   $sMetaDescription = ((utf8_strlen($sMetaDescription) > 195) && ($iSpace = utf8_strpos($sMetaDescription, ' ', 195)) !== false) ? mb_substr($sMetaDescription, 0, $iSpace, 'utf-8') . '..' : $sMetaDescription;

Но вариант с одной строчкой, только в том случаи, если у вас условие состояло из одного if, а не if / else if / else.
Проверить не могу.

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость