Вырезать текст 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 байтов - сама строка может иметь переменную длину в зависимости от количества байтов в каждом символе. Это также может быть опасно, так как вы можете сократить символ пополам (разделив несколько байтов).