2009-12-29 7 views
24

cuando uso substr() consigo un extraño personaje al finalfunción de PHP substr error()

$articleText = substr($articleText,0,500); 

tengo una potencia de 500 caracteres y < -

¿Cómo puedo solucionar este problema? ¿Es un problema de codificación? Mi idioma es griego

+0

hemos visto lo mismo en (Reino Unido) Inglés . – alimack

Respuesta

56

substr está contando utilizando bytes, y no caracteres.

griego probablemente significa que está utilizando una codificación de varios bytes, como UTF-8, y el recuento por bytes no es muy bueno para ellos.

Tal vez usar mb_substr podría ayudar, aquí: las funciones mb_* se han creado específicamente para codificaciones multibyte.

+4

Aprendiendo más y más cada día ... ¡Gracias stackoverflow! –

+1

Muchas gracias. Pero en cuanto a mí, lo principal es agregar 'mb_internal_encoding (" UTF-8 ");' antes de usar las funciones 'mb_ *'. Sin agregarlo todavía veo cuadrados. – ivkremer

+0

@ Kremchik No verá cuadrados, si usa 'mb_substr ($ short, 0, 75, 'utf-8')'. Entonces no necesitas usar 'mb_internal_encoding' antes de' mb_substr'. – trejder

6

Parece que está cortando un carácter Unicode por la mitad. Use mb_substr en su lugar para cortar en tiras unicode-safe.

+1

... con la llamada 'mb_internal_encoding ('utf-8')' antes o con el uso de ''utf-8'' como cuarto parámetro de' mb_substr'. Doc dice que es opcional y que cuando se omite, se usará el valor interno de codificación de caracteres, pero el pensamiento es (explicado en otro lugar en PHP doc), que la "codificación interna" de PHP es casi siempre "algo más" que tu codificación de página. Entonces, para cortar una cadena UTF8, se requiere este cuarto parámetro o llamada 'mb_internal_encoding ('utf-8')'. – trejder

19

Uso mb_substr en cambio, es capaz de tratar con múltiples codificaciones, no sólo cadenas de un solo byte como substr:

$articleText = mb_substr($articleText,0,500,'UTF-8'); 
+2

La parte "UTF-8" fue importante para mí, ¡no lo olvides! – JoeRocc

+1

"UTF-8" como parámetro opcional funcionó para mí. Tenga en cuenta que también puede utilizar mb_strlen() si está utilizando la longitud de la cadena para determinar si debe cortarse. –

+2

Una alternativa es usar 'mb_internal_encoding ('utf-8')' antes de cualquier comando 'mb_ *'. – trejder

0

ms_substr() también funciona excelentemente para la eliminación de la línea de arrastre extraña rompe, así, que me estaba teniendo problemas con después de analizar el código html. El problema no fue manejado por:

trim() 

o:

var_dump(preg_match('/^\n|\n$/', $variable)); 

o:

str_replace (array('\r\n', '\n', '\r'), ' ', $text) 

no debe quedar atrapado.

1

Solución alternativa para cadenas codificadas UTF-8 - esto convertirá UTF-8 en caracteres antes de cortar la subcadena.

$articleText = substr(utf8_decode($articleText),0,500); 

Para obtener la cadena articleText volver a UTF-8, será necesaria una operación adicional:

$articleText = utf8_encode(substr(utf8_decode($articleText),0,500)); 
1

uso de esta función, Funcionó para mí

function substr_unicode($str, $s, $l = null) { 
    return join("", array_slice(
     preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l)); 
} 

Créditos: http://php.net/manual/en/function.mb-substr.php#107698

+0

Utilice los enlaces de regreso por favor, c/p no es el acto apropiado para responder una pregunta .. –

0

Está intentando cortar el carácter Unicode. Así que preferí en lugar de substr() prueba mb_substr() en php.

substr()

substr (string $string , int $start [, int $length ]) 

mb_substr()

mb_substr (string $str , int $start [, int $length [, string $encoding ]]) 

Para obtener más información para substr() - Credits => Check Here

Cuestiones relacionadas