2010-07-20 17 views
5

consigo texto UTF-8 desde una base de datos, y quiero mostrar sólo los primeros $ len caracteres (acabado en una palabra). He intentado varias opciones, pero la función aún no funciona debido a los caracteres especiales (á, é, í, ó, etc.).Cortar un texto UTF-8 en PHP

¡Gracias por la ayuda!

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'); 

    ... 
    } 
} 

Editar a poner un ejemplo

Si trunco ​​un texto con 65 caracteres, devuelve:

Un jardin de Estilo neoclásico acorde con el ...

Si cambio los caracteres especiales (í, á), entonces devuelve:

Un jardin de Estilo neoclasico con ACORDE El Palacio de ...

Estoy seguro de que hay algo extraño con la codificación o el servidor, o PHP; ¡pero no puedo entenderlo! ¡Gracias!

Solución Final

estoy usando esta todo UTF8 PHP library y trabaja ahora ...

+0

Y si no usa text_limit, la codificación no genera problemas, ¿no? –

+0

el texto se muestra sin ningún problema. El problema surge cuando lo corto, esos caracteres especiales ocupan varios bytes, por lo que text_limit() devuelve una cadena realmente corta. – fesja

+0

posible duplicado de [Truncar una cadena multibyte a n caracteres] (http://stackoverflow.com/questions/2154220/truncate-a-multibyte-string-to-n-chars) – Gordon

Respuesta

7

uso mb_substr. primero arg la cuerda para verificar el segundo es la posición de inicio, el tercero es la longitud y el último es la codificación.

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

esto devolvería Str if $ len wa s 3 –

+0

mmm Ya estoy usando esa función ... – fesja

+0

woops, lo mire rápido y solo vi strlen. –

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

No está de paso suficientes argumentos para mb_strrpos() (usted ha omitido el desplazamiento - 3er parámetro, la codificación es el cuarto parámetro), trate de:

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

aunque con la segunda línea se omite, se ve bien, como se dice ... "Quiero mostrar sólo los primeros $ len caracteres (acabado en una palabra)" - la segunda línea se asegura de que termine en su conjunto palabra ?

EDITAR:mb_substr() debe estar cortando en $len número de caracteres, no bytes. ¿Estás seguro de que el texto original es en realidad UTF-8 y no otra codificación?

+0

gracias por esa corrección, pero no funciona. Esa segunda línea borra la última palabra incompleta (busca el espacio, y corta el texto hasta esa posición). – fesja

+0

Estoy usando 'mb_check_encoding ($ string,' UTF-8 ');' para verificar que la cadena tenga una codificación UTF8. Mis bases de datos están en UTF8 y el sistema my symfony tiene UTF8 ya que es un juego de caracteres predeterminado. ¿Alguna idea sobre qué revisar? ¡Gracias! – fesja

0

¿Qué tal intentar mb_strcut(). Los mismos parámetros que mb_substr().

1

Ok, así que esto me ha sido desconcertante que no se puede conseguir que esto funcione, ya que debería funcionar bien. Finalmente creo que he encontrado la razón por la cual esto no está funcionando para ti.

lo que creo que está pasando aquí es que el navegador está mostrando en la codificación mal y está dando salida UTF-8 caracteres.

que tienen un par de opciones. Primero, si está mostrando algo de esto como parte de una página html revise sus meta tags para ver si están configurando la codificación de caracteres.Si es así cambiar a esto:

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

siguiente si usted está recién dando salida esta directamente en el navegador utilizar la función de cabecera para establecer la codificación de caracteres de este modo:

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

una prueba sencilla:

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

sin esto, su navegador tendrá por defecto otra codificación y mostrará el texto incorrectamente. Espero que esto te ayude a solucionar este problema, si no seguiré intentándolo :)

+0

El OP dijo que no hay problema con la salida hasta que se use la función text_limit. Por lo tanto, la metaetiqueta se establece en IMO a UTF-8. Por cierto: intente utilizar editar en lugar de agregar respuestas nuevas y nuevas ;-) –

+0

muchas gracias Kelly, pero ese no era el problema, como dijo MartyIX. La solución: utilizando la siguiente biblioteca UTF8, simplemente funciona ahora, no me preguntes por qué http://tarski.googlecode.com/svn/branches/1.6/library/feedparser/lib-utf8.php – fesja

0

Esto podría deberse a que tu solución original truncó la cadena a 65 bytes, lo que normalmente equivaldría a 65 caracteres en un contexto ASCII solamente, pero se vuelve incorrecto cuando se usan los rangos de varios bytes de UTF-8. Al truncar una cadena a 65 bytes - la cadena en sí misma puede ser de longitud variable dependiendo del número de bytes en cada carácter. Eso también sería probablemente peligroso ya que podrías cortar un personaje por la mitad (dividiendo los múltiples bytes).