Использование PHP substr() со специальными символами в конце приводит к вопросительным знакам

Когда я использую функцию substr() в PHP, я получаю вопросительный знак (квадрат со знаком вопроса — в зависимости от браузера) в конце строки, когда этот последний символ был специальным, например ë или ö и т. д. ...

$introtext = html_entity_decode($item->description, ENT_QUOTES, "UTF-8");
$introtext = substr($introtext, 0, 200);

Как я могу избежать этого?


person Bert    schedule 06.06.2011    source источник
comment
это не вопрос Joomla, чистый php может решить эту проблему (лучше всего работает ответ Sruit A.Suk)   -  person Fanky    schedule 28.01.2019


Ответы (4)


Если ваша строка имеет многобайтовую кодировку (например, UTF-8), вам следует использовать mb_substr, чтобы избежать такие проблемы:

$introtext=mb_substr($introtext,0,200);
person lonesomeday    schedule 06.06.2011
comment
Здорово! Работает как положено :) - person Can Rau; 21.07.2015
comment
Это не работает со скандинавскими буквами, такими как åäö, необходимо добавить utf-8, как предложил Сруит А. Сук. - person EspeH; 20.08.2015
comment
Спасибо, это спасло мой день! - person Michi-2142; 02.12.2016
comment
Ах, это мне очень помогло. Специальные символы вызывали проблемы, поэтому после долгих отладок я обнаружил, что причиной была $myString[$i], которая также давала тот же недопустимый результат с substr. Однако теперь mb_substr полностью устранил проблему. - person Sean McManus; 20.02.2019
comment
@SeanMcManus Да, вы обнаружите, что в руководство. - person lonesomeday; 20.02.2019

Если кто-то попробовал предыдущие ответы, и это все еще не сработало:

Попробуйте добавить имя Unicode в mb_substr, например:

$introtext = mb_substr($introtext, 0, 200, 'utf-8');
person Sruit A.Suk    schedule 13.06.2015
comment
Принятый ответ у меня не сработал, мне нужно было, чтобы он работал со скандинавскими символами. Спасибо - person EspeH; 20.08.2015

Используйте mb_substr.

person ssapkota    schedule 06.06.2011
comment
Чем это отличается от всех предыдущих ответов? - person Peter Mortensen; 06.07.2019

Это потому, что substr не работает с многобайтовыми символами. substr, вероятно, сократит многобайтовый символ «пополам». Вместо этого вы должны использовать mb_substr. Также убедитесь, что ваш файл сохранен в кодировке UTF-8.

$introtext = mb_substr($introtext, 0, 200);
person alexn    schedule 06.06.2011