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.
La función html_entity_decode
es probablemente lo que quieres.
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 63E2 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
.