utf8_encode utf8 charset array acentos php html utf-8 webforms

utf8 - Obtenga campos que no sean UTF-8 como UTF-8 en PHP?



utf8_encode array php (8)

Tengo un formulario servido en no UTF-8 (en realidad está en Windows-1251). Las personas, por supuesto, publican allí los personajes que les gustan. El navegador convierte los caracteres imprimibles en Windows 1251 a entidades html para que yo pueda reconocerlos. Por ejemplo, si el usuario escribe un →, recibo un → . Eso es parcialmente bueno, como, si acabo de repetirlo, el navegador mostrará correctamente el → pase lo que pase.

El problema es que realmente hago un htmlspecialchars () en el texto antes de mostrarlo (es una función de PHP para convertir caracteres especiales a entidades HTML, por ejemplo & se convierte en & ). Mis usuarios a veces escriben cosas como — o © y quiero mostrarlos como reales — o © , no - y ©.

No hay forma de que yo distinga un → de → , porque los obtengo como → . Y, dado que me gusta el texto, también obtengo un → para → desde el navegador, → un → que se muestra como → en un navegador. Entonces la entrada del usuario se corrompe.

¿Hay alguna manera de decir: "Bien, sirvo este formulario en Windows-1251, pero ¿ pueden enviarme la información en UTF-8 y dejar que me ocupe de eso?"

Oh, sé que la buena idea es cambiar todo el software a UTF-8, pero eso es demasiado trabajo, y me gustaría obtener una solución rápida para esto. Si esto es importante, el enctype del formulario es "multipart / form-data" (incluye el cargador de archivos, por lo que no puede usar ningún otro enctype). Yo uso Apache y PHP.

¡Gracias!


Verificas si los personajes están dentro de un cierto rango. Si quedan fuera del rango de caracteres estándar UTF-8, haga lo que quiera con él. Haría esto mirando cada personaje &, #, 8, 5, 9, 4 y analizándolo en algo en lo que puedas aplicar algo.

A menos que encuentre un lugar donde alguien haya creado una secuencia de comandos de conversión de Windows-1251 a UTF-8, probablemente tendrá que hacer la suya propia. Probablemente tengas que mirar cada personaje específico y ver qué hay que hacer con él. Si es algo así como & copy; querrá manejarlo de manera diferente que & # 8594; porque el segundo tiene el # en él.

Creo que esto responde tu pregunta.


El navegador convierte de manera útil los caracteres imprimibles en Windows 1251 a entidades html

Bueno, casi, excepto que no es del todo útil. Ahora no puede ver la diferencia entre un "& # 411; verdadero" que alguien escribió esperando que salga como una cadena de texto con un ''&'' y un carácter ''Б''.

De hecho, hago un htmlspecialchars () en el texto antes de mostrarlo

Sí. Debe hacer eso, o si no tiene un problema de seguridad.

De acuerdo, sirvo este formulario en Windows-1251, pero ¿pueden enviarme la información en UTF-8 y dejar que lo solucione yo mismo?

Sí, supuestamente envías "accept-charset =" UTF-8 "" en la etiqueta del formulario. Pero la realidad es que no funciona en IE. Para obtener un formulario en UTF-8, debe enviar un formulario (página) en UTF-8.

Sé que la buena idea es cambiar todo el software a UTF-8,

Sip. Bueno, al menos la codificación de la página que contiene el formulario debe ser UTF-8.



No podrá distinguir entre el navegador que convierte un punto de código a una entidad y los usuarios que escriben una entidad porque se ven idénticos. La solución real es renunciar a Windows 1251. En su lugar, sirva la página web y el formulario en UTF-8, solicite la codificación UTF-8 y todos estos problemas deberían desaparecer.


Puede convertir las cadenas a UTF-8 usando las funciones de múltiples bytes de PHP. Desde allí puedes hacer lo que quieras. Especialmente el mb_convert_encoding() para moverlo de Windows-1251 a UTF-8, o donde sea.

Aunque no entiendo bien tu pregunta, porque si alguien ingresa & amp; como cadena de texto, cuando haces htmlspecialchars() que debería convertirlo a & amp; amp; ... que cuando se ejecutaba a través de html_entity_decode() saldría como la cadena de texto que ingresó el usuario.

Esto es por supuesto si no has usado la opción double_encode cuando ejecutas tu cadena a través de htmlspecialchars()


Puede establecer el cuarto parámetro de la función htmlspecialchars ( double_encode , desde PHP 5.2.3) a falso para evitar que las referencias de caracteres se vuelvan a codificar.

O primero decodifica esas referencias de caracteres existentes.


mbstring admite las entidades de HTML "charset"

for($i=0; $i<strlen($out); $i++) { printf(''%02X '', ord($out[$i])); }

61 20 E2 86 92 20 62 20 26 20 63
E2 86 92 es la secuencia de bytes para → (FLECHA DERECHA) en utf8.

<form action="action.php" method="get" accept-charset="UTF-8"> <!-- some elements --> </form>

Todos los navegadores deben devolver los valores en la codificación especificada en accept-charset .