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

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

5 голосов
/ 21 июля 2010

Я получаю текст 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 jardin de estilo neoclasico acorde con el Palacio de…

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

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

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

Ответы [ 5 ]

7 голосов
/ 21 июля 2010

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

mb_substr ("String", 0, $len, 'utf-8');
3 голосов
/ 21 июля 2010
mb_strrpos($text," ", 'UTF-8')

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

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

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

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

1 голос
/ 22 июля 2010

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

Я думаю, что здесь происходит то, что ваш браузер отображает неправильную кодировку, а вы выводите символы 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');
?>

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

0 голосов
/ 22 июля 2010

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

0 голосов
/ 22 июля 2010

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

...