2010-07-20 2 views
5

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

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

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 де Estilo neoclásico acorde кон-эль ...

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

Un Jardin De Estilo neoclasico acorde против Эль Паласио де ...

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

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

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

+0

И если вы не используете text_limit, тогда кодирование не создает проблем, верно? –

+0

текст отображается без проблем. Проблема возникает, когда я вырезал ее, что эти специальные символы занимают несколько байтов, поэтому text_limit() возвращает очень короткую строку. – fesja

+0

Возможный дубликат [Обрезать многобайтовую строку на n символов] (http://stackoverflow.com/questions/2154220/truncate-a-multibyte-string-to-n-chars) – Gordon

ответ

7

использование mb_substr. first arg строка для проверки второй - это начальная позиция, третья длина и последняя - кодировка.

mb_substr ("String", 0, $len, 'utf-8'); 
+0

, это вернет Str, если $ len wa s 3 –

+0

mmm Я уже пользуюсь этой функцией ... – fesja

+0

woops, извините, посмотрел на нее быстро и только увидел strlen. –

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

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

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

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

EDIT:mb_substr() должно быть разрезание на $len количество символов, а не байтов. Вы уверены, что исходный текст на самом деле является UTF-8, а не какой-то другой кодировкой?

+0

спасибо, что исправление, но это не работает. Эта 2-я строка удаляет последнее неполное слово (оно ищет пробел, и оно сокращает текст до этой позиции). – fesja

+0

Я использую 'mb_check_encoding ($ string,' UTF-8 ');' чтобы проверить, что строка имеет кодировку UTF8. Мои базы данных находятся в UTF8, и моя система symfony имеет UTF8, поскольку это набор символов по умолчанию. Любые идеи о том, что проверить? благодаря! – fesja

0

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

1

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

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

OP сказал, что нет проблемы с выходом до тех пор, пока не будет использована функция text_limit. Поэтому метатег - это ИМО, установленный в UTF-8. BTW: попробуйте использовать редактирование вместо добавления новых и новых ответов ;-) –

+0

благодарит много келли, но это не проблема, как сказал MartyIX. Решение: используя следующую библиотеку UTF8, сейчас это работает, не спрашивайте меня, почему http://tarski.googlecode.com/svn/branches/1.6/library/feedparser/lib-utf8.php – fesja

0

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