Почему мой php substr () показывает непонятные символы при вырезании текста? - PullRequest
8 голосов
/ 23 января 2010

Я использую функцию substr() для ограничения количества символов в строках. но иногда выходной текст содержит некоторые непонятные символы и знаки вопроса и т. д. *

текст, который является "substred", уже закодирован в UTF8, а НЕ в html-сущностях, чтобы создать подобную проблему.

Спасибо

Ответы [ 4 ]

32 голосов
/ 23 января 2010

Потому что вы режете своих персонажей пополам.

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

3 голосов
/ 23 января 2010

Причина в том, что вы используете UTF-8, это многобайтовая кодировка, а substr () работает только с однобайтовыми! htmlentities () не имеет значения.

Вы ДОЛЖНЫ использовать mb_substr () http://php.net/manual/en/function.mb-substr.php и другие многобайтовые функции

0 голосов
/ 03 апреля 2017

Если у вас есть проблемы с кодированием, вы также можете применить функцию html_entity_decode (), которая преобразует все сущности HTML в соответствующие им символы. Например:

echo substr(html_entity_decode($string_to_cut), 0, 28) . "...";

Это тоже должно сработать.

0 голосов
/ 11 марта 2016

Просто расширить Гурмбо - это ответ. Использование mb_substr решит вашу проблему, но, тем не менее, если специальные символы появляются в конце, когда вы отключаетесь, все равно отображаются некоторые специальные символы. Поэтому, когда я провел какое-то исследование, Wordpress имел метод wp_html_excerpt , чтобы решить эту проблему.

Метод wp_html_excerpt удаляет эти специальные символы в конце строки.

Вот исходный код из WordPress.

/**
 * Safely extracts not more than the first $count characters from html string.
 *
 * UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT*
 * be counted as one character. For example & will be counted as 4, < as
 * 3, etc.
 *
 * @since 2.5.0
 *
 * @param string $str   String to get the excerpt from.
 * @param int    $count Maximum number of characters to take.
 * @param string $more  Optional. What to append if $str needs to be trimmed. Defaults to empty string.
 * @return string The excerpt.
 */
function wp_html_excerpt( $str, $count, $more = null ) {
    if ( null === $more )
        $more = '';
    $str = wp_strip_all_tags( $str, true );
    $excerpt = mb_substr( $str, 0, $count );
    // remove part of an entity at the end
    $excerpt = preg_replace( '/&[^;\s]{0,6}$/', '', $excerpt );
    if ( $str != $excerpt )
        $excerpt = trim( $excerpt ) . $more;
    return $excerpt;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...