Estoy buscando una estrategia/consejo general sobre cómo manejar la entrada UTF-8 no válida de los usuarios.¿Cómo manejar la entrada del usuario de caracteres UTF-8 no válidos?
Aunque mi aplicación web usa UTF-8, de alguna manera algunos usuarios introducen caracteres no válidos. Esto causa errores en PHP json_encode() y en general parece una mala idea tener alrededor.
W3C I18N FAQ: Multilingual Forms dice "Si se reciben datos que no son UTF-8, se debe enviar un mensaje de error nuevamente".
- ¿Cómo exactamente esto debería hacerse prácticamente, en un sitio con docenas de lugares diferentes donde se pueden ingresar datos?
- ¿Cómo se presenta el error de una manera útil para el usuario?
- ¿Cómo almacena y muestra temporalmente datos de formularios incorrectos para que el usuario no pierda todo su texto? ¿Despojar a los malos personajes? Use un personaje de reemplazo, y ¿cómo?
- Para los datos existentes en la base de datos, cuando se detectan datos UTF-8 no válidos, debo tratar de convertirlos y guardarlos de nuevo (¿cómo? utf8_encode()? mb_convert_encoding()?), O dejar como está en la base de datos pero haciendo algo (¿qué?) antes de json_encode()?
EDIT: Estoy muy familiarizado con la extensión mbstring y no estoy preguntando "cómo funciona UTF-8 en PHP". Me gustaría recibir consejos de personas con experiencia en situaciones del mundo real sobre cómo manejaron esto.
Edit2: Como parte de la solución, Realmente me gustaría ver a un rápido método para convertir caracteres no válidos a U + FFFD
no sigue las directrices se ha vinculado, pero acabo de reemplazar secuencias de bytes no válidos con [U + FFFD] (http://www.fileformat.info/info/unicode/char/ fffd/index.htm) así que puedo terminar con esto. – zildjohn01
@ zildjohn01, ¿cuál es la mejor manera de hacer esto (qué funciones de PHP?). ¿Podría dejar una respuesta detallada con su enfoque? – philfreo
Para ser sincero, no es muy emocionante. Acabo de traducir un analizador UTF-8 de C a PHP. Escanea el byte de la cadena por byte, y si se encuentra una secuencia de byte no válida, reescribe la cadena manualmente. Lento, pero portátil. – zildjohn01