Вырезать текст UTF8 в PHP

Я получаю текст UTF8 из базы данных и хочу показать только первые символы $len (заканчивающиеся словом). Я пробовал несколько вариантов, но функция все еще не работает из-за специальных символов (á, é, í, ó и т. Д.).

Спасибо за помощь!

function text_limit($text, $len, $end='...')
{ 

  mb_internal_encoding('UTF-8');
  if( (mb_strlen($text, 'UTF-8') > $len) ) { 

    $text = mb_substr($text, 0, $len, 'UTF-8');
    $text = mb_substr($text, 0, mb_strrpos($text," ", 'UTF-8'), 'UTF-8');

    ...
  }
}

Изменить, чтобы добавить пример

Если я усекаю текст с 65 символами, он возвращает:

Un jardín de estilo neoclásico acorde con el…

Если я изменяю специальные символы (í, á), то возвращается:

Un jardin de estilo neoclasico acorde con el Palacio de…

Я уверен, что есть что-то странное с кодировкой, сервером или php; но я не могу понять это! Спасибо!

Окончательное решение

Я использую эту библиотеку PHP UTF8 и все работает сейчас...

5 ответов

Используйте mb_substr. первый аргумент строка для проверки второй это начальная позиция, третья длина и последняя кодировка.

mb_substr ("String", 0, $len, 'utf-8');
mb_strrpos($text," ", 'UTF-8')

Вы не передаете достаточно аргументов mb_strrpos() (вы пропустили смещение - 3-й параметр, кодировка - 4-й параметр), попробуйте:

mb_strrpos($text," ", 0, 'UTF-8')

Хотя во 2-й строке он пропущен, он выглядит нормально, как вы говорите... "Я хочу показать только первые символы $len (заканчивающиеся одним словом)" - 2-ая строка гарантирует, что она заканчивается на целом слове?

РЕДАКТИРОВАТЬ: mb_substr() должен резать на $len количество символов, а не байтов. Вы уверены, что оригинальный текст на самом деле является UTF-8, а не какой-то другой кодировкой?

Хорошо, это сбило меня с толку, что вы не можете заставить это работать, потому что это должно работать просто отлично. Наконец, я думаю, что нашел причину, по которой это не работает для вас.

Я думаю, что здесь происходит то, что ваш браузер отображает неправильную кодировку, а вы выводите символы utf-8.

у вас есть пара вариантов. Во-первых, если вы отображаете все это как часть html-страницы, проверьте ваши метатеги, чтобы увидеть, устанавливают ли они кодировку символов. Если это так, измените это на следующее:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

далее, если вы просто выводите это непосредственно в браузер, используйте функцию заголовка, чтобы установить кодировку символов следующим образом:

header("Content-type: text/html; charset=utf-8");

легкий тест:

<?php
    header("Content-type: text/html; charset=utf-8");
    $text = "áéíó";
    echo mb_substr($text, 0, 3, 'utf-8');
?>

без этого ваш браузер по умолчанию будет использовать другую кодировку и некорректно отображать текст. Надеюсь, это поможет вам решить эту проблему, если нет, я буду продолжать пытаться:)

Как насчет попытки mb_strcut(), Те же параметры, что и mb_substr(),

Это может быть связано с тем, что исходное решение урезало строку до 65 байтов, что обычно равняется 65 символам в контексте только ASCII, но становится неверным, когда используются многобайтовые диапазоны UTF-8. При сокращении строки до 65 байтов - сама строка может иметь переменную длину в зависимости от количества байтов в каждом символе. Это также может быть опасно, так как вы можете сократить символ пополам (разделив несколько байтов).

Другие вопросы по тегам