mostrar - utf-8 php acentos
¿Cómo detectar la cadena utf-8 con formato incorrecto en PHP? (4)
La función iconv a veces me da un error:
Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]
¿Hay una manera de detectar que hay caracteres ilegales en la cadena utf-8 antes de poner los datos en inconv?
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.
Vea aquí para una referencia:
http://www.w3.org/TR/xml/#charsets
Esa no es una lista completa, muchos analizadores también rechazan algunos caracteres de control de bajo número, pero no puedo encontrar una lista completa en este momento.
Sin embargo, iconv podría tener soporte integrado para esto:
Primero, tenga en cuenta que no es posible detectar si el texto pertenece a una codificación no deseada específica. Solo puede verificar si una cadena es válida en una codificación dada.
Puede hacer uso de la verificación de validez UTF-8 que está disponible en preg_match
[Manual de PHP] desde PHP 4.3.5. Devolverá 0
(sin información adicional) si se proporciona una cadena no válida:
$isUTF8 = preg_match(''//u'', $string);
Otra posibilidad es mb_check_encoding
[Manual de PHP] :
$validUTF8 = mb_check_encoding($string, ''UTF-8'');
Otra función que puede usar es mb_detect_encoding
[Manual de PHP] :
$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 / soltar secuencias inválidas sobre la marcha. (Sin embargo, si iconv
encuentra una secuencia de este tipo, 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;
Puede usar @
y verificar la longitud de la cadena de retorno:
strlen($string) === strlen(@iconv(''UTF-8'', ''UTF-8//IGNORE'', $string));
Verifique también los ejemplos en la página de manual de iconv
.
No ha compartido el código fuente de donde proviene el aviso. Deberías añadirlo si quieres una sugerencia más concreta.
Puede intentar usar mb_detect_encoding
para detectar si tiene un conjunto de caracteres diferente (que UTF-8) y luego mb_convert_encoding
para convertir a UTF-8 si es necesario. Es más probable que las personas le den contenido válido en un conjunto de caracteres diferente al de UTF-8 no válido.
ponga una @ delante de iconv () para suprimir la NOTICE y una // IGNORE después de UTF-8 en la identificación de codificación de origen para ignorar los caracteres no válidos:
@iconv( ''UTF-8//IGNORE'', $destinationEncoding, $yourString );