2010-02-24 24 views
13

Al intentar ejecutar una cadena a través de la función htmlentities de PHP, tengo algunos casos en los que aparece un error de 'Secuencia de multibytos no válida'. ¿Hay alguna manera de limpiar la cadena antes de llamar a la función para evitar que ocurra este error?htmlentities 'Error de secuencia multibyte no válida'

Respuesta

8

Para PHP 5.3.0 y versiones inferiores, el juego de caracteres predeterminado para htmlentities() es ISO-8859-1. (Manual)

Probablemente lo esté aplicando a una cadena UTF-8. Especificar el conjunto de caracteres usando

htmlentities($string, (whatever), "UTF-8"); 

A partir de PHP 5.4.0, el conjunto de caracteres por defecto es UTF-8.

9

He encontrado escenarios en los que no es suficiente para especificar UTF-8 y encontré útil la opción ENT_IGNORE. No creo que esté documentado para htmlentities, solo para htmlspecialchars pero funciona para sofocar el error.

+2

Sé que este es un tema viejo, pero me encontré con este problema también y pensé que podría ser la pena señalar que no se recomienda el uso de ENT_IGNORE ya que puede tener implicaciones de seguridad: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean

+0

Sí, ENT_IGNORE fue la única solución (/ hack) que encontré para este problema, por el momento. – Kzqai

6

En general el php ini establecer display_errors se puede utilizar para controlar si los errores se envían al navegador, las log_errors ajuste ini se pueden utilizar de forma independiente para controlar si los errores se escriben en archivo de registro, y si una costumbre error manejador se ha establecido con set_error_handler() entonces siempre se llama para todos los errores y puede leer los valores de display_errors y log_errors junto con el valor de error_reporting() y tomar el curso de acción apropiado, ¿verdad?

¡Error! En este caso, htmlspecialchars() y htmlentities() solo activan el error si el valor de display_errors es falso. Si el valor de display_errors es verdadero, ¡entonces no se desencadena ningún error! Este comportamiento aparentemente absurdo hace que sea imposible detectar estos errores durante la depuración con display_errors activado.

I got the information from here

+0

Gracias por señalar esto - ¡explica por qué solo vi este error en la producción! No pude entender por qué, en mi cuadro de desarrollo, donde todos los informes de errores se convirtieron en _ON_, no pude reproducir el error. – thaddeusmt

2

¿Utiliza substr en algún lugar de la cadena que desea comprobar. Sugiero usar mb_substr como alternativa. El problema es que substr no es consciente de unicode. Por lo tanto, solo está cortando bytes en su juego de caracteres de varios bytes.

8

A partir de PHP 5.4 se debería usar algo a lo largo de la siguiente escapar correctamente la salida:

$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding); 

ENT_SUBSTITUTE reemplaza secuencias unidad de código no válidos por (en lugar de devolver una cadena vacía).

ENT_DISALLOWED reemplaza los puntos de código que no son válidos en el doctype especificado con .

ENT_HTML5 especifica el doctype usado. Dependiendo de lo que esté utilizando, puede elegir ENT_HTML401, ENT_XHTML o ENT_XML1.

Utilizando esas opciones, asegúrese de que el resultado siempre sea válido en el tipo de documento dado, independientemente del tipo de entrada abominable que obtenga.

Además, no olvide especificar el $stringEncoding. Confiar en el valor predeterminado es una mala idea ya que depende de la configuración ini y puede (y lo hizo) cambiar entre versiones.

+0

La documentación de PHP no está clara al respecto, pero 'ENT_HTML5' es redundante para htmlspecialchars. Consulte http://stackoverflow.com/a/14532168/427545 – Lekensteyn

+3

@Lekensteyn 'ENT_HTML5' no es redundante, especialmente cuando se usa' ENT_DISALLOWED'. Reemplazará los puntos de código que no sean válidos en el doctype HTML5 con el carácter de reemplazo Unicode. P.ej. vea este ejemplo: http://codepad.viper-7.com/q5bPMQ El 'ENT_HTML5 | ENT_DISALLOWED' se asegura de que el resultado no contenga ningún punto de código no válido. – NikiC

+0

Gracias por la corrección, amplié mi respuesta para tener en cuenta los caracteres no válidos. Al principio no sabía la diferencia entre DISALLOWED y SUBTITUTE, pero ahora me ha quedado claro. – Lekensteyn

-1

html_entities ($ variable, ENT_QUOTES); siempre funciona bien para mí.

+0

La codificación predeterminada en algunas versiones de php es iso-something-something, y solo más adelante en php 5.4 es utf-8. Tenga en cuenta que, independientemente de esto, no es coherente en todas las versiones, por lo que probablemente sea mejor especificar la codificación para que coincida con la codificación que esté realmente en uso. – Kzqai

-2

Tenga en cuenta que usar utf-8 requiere la habilitación de funciones de cadenas de múltiples bytes. Esto podría significar reemplazar funciones como substr con mb_substr, excepto que php proporciona una configuración de php ini para activar la sobrecarga de esas funciones con el equivalente de mb.

ver aquí para más detalle: http://www.php.net/manual/en/mbstring.overload.php

Cuestiones relacionadas