2011-07-17 12 views
18
función iconv

veces me da un error:¿Cómo detectar una cadena UFF-8 mal formada en PHP?

Notice: 
iconv() [function.iconv]: 
Detected an incomplete multibyte character in input string in [...] 

¿Hay una manera de detectar que hay caracteres no válidos en UTF-8 cuerdas antes de poner los datos a inconv?

+0

Mientras tanto he encontrado esto: http: // stackoverflow.com/questions/4407854/how-to-detect-if-have-to-apply-utf8-decode-or-encode-on-a-string – rsk82

Respuesta

46

En primer lugar, tenga en cuenta que no es posible detectar si el texto pertenece a una codificación específica no deseada. Solo puedes verificar si una cadena es válida en una codificación dada.

Puede utilizar la verificación de validez UTF-8 que está disponible en preg_match[PHP Manual] desde PHP 4.3.5. Se volverá 0 (sin información adicional) si se da una cadena no válida:

$isUTF8 = preg_match('//u', $string); 

Otra posibilidad es mb_check_encoding[PHP Manual]:

$validUTF8 = mb_check_encoding($string, 'UTF-8'); 

Otra de las funciones que puede utilizar es mb_detect_encoding[PHP Manual]:

$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true)); 

Es importante establecer el parámetro strict en true.

Además, iconv[PHP Manual] le permite cambiar/eliminar secuencias no válidas sobre la marcha. (Sin embargo, si iconv encuentros tal secuencia, se genera una notificación; este comportamiento no se puede cambiar.)

echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string), PHP_EOL; 
echo 'IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $string), PHP_EOL; 

Usted puede utilizar @ y comprobar la longitud de la cadena de retorno:

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string)); 

Comprobar los ejemplos en la página del manual iconv también.

No ha compartido el código fuente de donde se deriva el aviso. Debe agregarlo si quiere una sugerencia más concreta.

+0

, no está equivocado, pero parece que 'preg_match ('!.! U', $ str)' hace truco: silenciosamente comprueba si str es utf-8 antes de intentar encontrar algo. - ese punto en la expresión regular ni siquiera es necesario – rsk82

+0

@ user393087: He realizado una ligera modificación para que el método 'preg_match' también funcione correctamente en cadenas vacías. – hakre

+2

@ Alan: Gracias por la buena edición. – hakre

0

La especificación sobre qué caracteres no son válidos en UTF-8 es bastante clara. Probablemente quieras quitarlos antes de intentar analizarlos. No deberían estar allí, así que si pudieras evitarlo incluso antes de generar el XML sería aún mejor.

ver aquí para una referencia:

http://www.w3.org/TR/xml/#charsets

Eso no es una lista completa, muchos analizador también no permitir algunos caracteres de número bajo de control, pero no puedo encontrar una lista completa en este momento.

Sin embargo, iconv podría tener soporte nativo para esto:

http://www.zeitoun.net/articles/clear-invalid-utf8/start

0

Usted podría tratar de usar mb_detect_encoding para detectar si tiene un conjunto de caracteres diferente (que no sea UTF-8) a continuación, para convertir a mb_convert_encoding UTF-8 si es necesario. Es más probable que las personas le proporcionen contenido válido en un conjunto de caracteres diferente que darle un UTF-8 no válido.

+0

Tenga en cuenta que las cadenas ASCII válidas también son cadenas UTF8 válidas. Esto significa que mb_detect_encoding devolverá "ASCII" para cualquier cadena que sea una cadena UTF8 válida y que no contenga caracteres Unicode – GordonM

0

poner una @ delante de iconv() para suprimir el aviso y la // ignora después de UTF-8 en codificación de fuente Identificación de ignorar caracteres no válidos:

@iconv('UTF-8//IGNORE', $destinationEncoding, $yourString); 
+0

Sé cómo ignorarlo, no sé cómo detectarlo, no quiero pasarlo silenciosamente por mi código. – rsk82

+0

¿Qué quieres hacer después de detectar el error? – nobody

+0

Por cierto, la solución 'preg_match()' en la otra pregunta es muy interesante. Me gustaría ir con eso. – nobody

Cuestiones relacionadas