Ошибка PHP-функции substr()

Когда я использую substr(), я получаю странный символ в конце

$articleText = substr($articleText,0,500);

У меня есть вывод 500 символов и � ‹--

Как я могу это исправить? Это проблема с кодировкой? Мой язык греческий.


person Stoikidis    schedule 29.12.2009    source источник
comment
Видел то же самое на (британском) английском.   -  person alimack    schedule 25.08.2014


Ответы (7)


substr считает байты, а не символы.

греческий, вероятно, означает, что вы используете какую-то многобайтовую кодировку, например UTF-8, и подсчет по байтам не совсем подходит для них.

Возможно, использование mb_substr может помочь, здесь: mb_* были созданы специально для многобайтовых кодировок.

person Pascal MARTIN    schedule 29.12.2009
comment
Узнавайте все больше и больше каждый день... Спасибо, stackoverflow! - person Boris Delormas; 19.12.2011
comment
Спасибо большое. Но как по мне главное добавить mb_internal_encoding("UTF-8"); перед использованием mb_* функций. Без добавления я все еще вижу квадраты. - person ivkremer; 27.12.2013
comment
@Kremchik Вы не увидите квадратов, если используете mb_substr($short, 0, 75, 'utf-8'). Тогда вам не нужно использовать mb_internal_encoding перед mb_substr. - person trejder; 23.06.2014

Вместо этого используйте mb_substr, он может работать с несколькими кодировками, а не только с однобайтовыми строками, как substr:

$articleText = mb_substr($articleText,0,500,'UTF-8');
person Uğur Özpınar    schedule 29.01.2012
comment
Часть UTF-8 была важна для меня — не забывайте об этом! - person ; 10.07.2013
comment
У меня работал UTF-8 как необязательный параметр. Имейте в виду, что вы также можете использовать mb_strlen(), если вы используете длину строки, чтобы определить, нужно ли ее обрезать. - person Kent Munthe Caspersen; 15.07.2013
comment
Альтернативой является использование mb_internal_encoding('utf-8') перед любой командой mb_*. - person trejder; 23.06.2014

Похоже, вы разрезаете символ Юникода пополам. Вместо этого используйте mb_substr для нарезки строк, безопасной для Unicode.

person deceze♦    schedule 29.12.2009
comment
...с вызовом mb_internal_encoding('utf-8') перед или с использованием 'utf-8' в качестве четвертого параметра mb_substr. Doc говорит, что это необязательно, и когда оно опущено, будет использоваться значение внутренней кодировки символов, но думаю (объяснено где-то еще в документе PHP), что внутренняя кодировка PHP почти всегда отличается от кодировки вашей страницы. Таким образом, для нарезки строки UTF8 этот четвертый параметр или вызов mb_internal_encoding('utf-8') становится обязательным. - person trejder; 23.06.2014

Альтернативное решение для строк в кодировке UTF-8 - это преобразует UTF-8 в символы перед вырезанием подстроки.

$articleText = substr(utf8_decode($articleText),0,500);

Чтобы вернуть строку articleText обратно в UTF-8, потребуется дополнительная операция:

$articleText = utf8_encode( substr(utf8_decode($articleText),0,500) );
person Kristoffer Bohmann    schedule 30.03.2013

используйте эту функцию, она работала для меня

function substr_unicode($str, $s, $l = null) {
    return join("", array_slice(
        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}

Кредиты: http://php.net/manual/en/function.mb-substr.php#107698

person Moussawi7    schedule 07.05.2013

ms_substr() также отлично работает для удаления странных концевых разрывов строк, с которыми у меня возникли проблемы после синтаксического анализа html-кода. Проблема НЕ решалась:

 trim() 

or:

 var_dump(preg_match('/^\n|\n$/', $variable));

or:

str_replace (array('\r\n', '\n', '\r'), ' ', $text)

Не лови.

person Dr Nick Engerer    schedule 18.08.2012

Вы пытаетесь вырезать символ Юникода. Поэтому я предпочел вместо substr() попробовать mb_substr() в php.

substr()

substr ( string $string , int $start [, int $length ] )

mb_substr()

mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

Для получения дополнительной информации о substr() - Кредиты => Проверьте здесь

person GowriShankar    schedule 27.10.2014