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
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.
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.
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.
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
¿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.
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.
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
@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
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
html_entities ($ variable, ENT_QUOTES); siempre funciona bien para mí.
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
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
- 1. msgfmt error de "secuencia multibyte no válida" en un texto polaco
- 2. de Cuerda # no codifica la fijación de "secuencia de bytes no válida en UTF-8" error
- 3. htmlspecialchars(): Secuencia de multibyte inválida en el argumento
- 4. Causas posibles de "StreamCorruptedException: encabezado de secuencia no válida"
- 5. Ruby Secuencia de bytes no válida en UTF-8
- 6. secuencia de bytes no válida para codificar "UTF8"
- 7. Explicación del error JAXB: bytes no válida 1 de 1 byte secuencia de codificación UTF-8
- 8. de error: El servicio no es válida
- 9. Deseleccionar clave de carga no válida Error, '{'
- 10. Raíles, Heroku y secuencia de bytes no válida en el error UTF-8
- 11. Solr: org.apache.solr.common.SolrException: Fecha no válida de la secuencia:
- 12. error extraños sobre la sintaxis no válida
- 13. extraño Oracle SQL "no válida identificador" error
- 14. System.ArgumentException: no válida JSON error primitiva
- 15. Error de Postgres en la inserción - ERROR: secuencia de bytes no válida para la codificación "UTF8": 0x00
- 16. R: multibyte inválida cadena
- 17. Error # 2032: error de secuencia
- 18. htmlentities() vs. htmlspecialchars()
- 19. Java no funciona con regex \ s, dice: secuencia de escape no válida
- 20. Django - La forma no válida, pero no hay error
- 21. Paypal Error de sandbox de configuración de comerciante no válida
- 22. Asignación de matriz C++ error: asignación de matriz no válida
- 23. Interpretación de error valgrind escritura no válida de tamaño 4
- 24. htmlentities y é (e acute)
- 25. Error de codificación de los piñones en el archivo js: secuencia de bytes UTF-8 no válida
- 26. reCaptcha show "error de entrada: referencia no válida"
- 27. VBScript no válida error de carácter 800A0408 compilación
- 28. Python print statement "Error de sintaxis: sintaxis no válida"
- 29. Regex de Java para hacer coincidir las llaves - "secuencia de escape no válida"
- 30. htmlentities destruye cadenas utf-8
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
Sí, ENT_IGNORE fue la única solución (/ hack) que encontré para este problema, por el momento. – Kzqai