2010-01-03 18 views
12

Tengo un cuadro html con el que los usuarios pueden ingresar texto. Me gustaría asegurar que todo el texto ingresado en el cuadro esté codificado en UTF-8 o convertido a UTF-8 cuando el usuario termine de escribir. Además, no entiendo cómo se eligen varias codificaciones UTF cuando se ingresan en un cuadro de texto.¿Cómo me aseguro de que el texto codificado en un formulario sea utf8

Generalmente tengo curiosidad acerca de lo siguiente:

  • ¿Cómo determina un navegador qué codificaciones para utilizar cuando un usuario está escribiendo en un cuadro de texto?
  • ¿Cómo puede javascript determinar la codificación de un valor de cadena en un cuadro de texto html?
  • ¿Puedo forzar que el navegador use solo la codificación UTF-8?
  • ¿Cómo puedo codificar codificaciones arbitrarias en UTF-8 Supongo que hay una biblioteca de JavaScript para esto?

** Editar **

eliminado algunas preguntas innecesarias a mis objetivos.

Este tutorial me ayudó a comprender mejor los códigos de caracteres de JavaScript, pero tiene errores y en realidad no traduce los códigos de caracteres a utf-8 en todos los casos. http://www.webtoolkit.info/javascript-base64.html

+0

¡Esas son muchas preguntas! ¿Tenemos que responderlos todos para publicar una respuesta? –

+0

@Mark Byers para nada, creo que están relacionados con el problema que intento resolver. Las respuestas a las primeras 4 preguntas me acercan a mi solución. –

Respuesta

15
  • ¿Cómo determina un navegador qué codificaciones para utilizar cuando un usuario está escribiendo en un cuadro de texto?

Utiliza la codificación de la página fue decodificada como por defecto. De acuerdo con the spec, debe poder anular esto con el atributo accept-charset del elemento <form>, pero IE tiene errores, por lo que no debe confiar en esto (he visto varias fuentes diferentes que describen varios errores diferentes, y no lo hago). Tengo todas las versiones relevantes de IE delante de mí para probar, así que lo dejo así).

  • ¿Cómo puede Javascript a determinar la codificación de un valor de cadena en un cuadro de texto html?

Todas las cadenas en JavaScript están codificadas en UTF-16. El navegador mapeará todo en UTF-16 para JavaScript, y desde UTF-16 en cualquier página codificada.

UTF-16 es una codificación que surgió de UCS-2. Originalmente, se pensaba que 65,536 puntos de código serían suficientes para todo Unicode, por lo que una codificación de caracteres de 16 bits sería suficiente. Resultó que no es el caso, por lo que el conjunto de caracteres se expandió a 1,114,112 puntos de código. Con el fin de mantener la compatibilidad con versiones anteriores, algunos intervalos no utilizados del juego de caracteres de 16 bits se reservaron para parejas sustitutas, en las que se usaron dos unidades de código de 16 bits para codificar un solo carácter. Lea en UTF-16 and UCS-2 on Wikipedia para más detalles.

El resultado es que cuando tiene una cadena str en JavaScript, str.length no le da el número de caracteres, le da el número de unidades de código, donde dos unidades de código se pueden utilizar para codificar un solo carácter, si ese personaje no está dentro del plano multilingüe básico.Por ejemplo, "abc".length le da 3, pero "".length le da 6; y "".substring(0,1) da lo que parece una cadena vacía, ya que la mitad de un par suplente no se puede mostrar, pero la cadena todavía contiene ese carácter no válido (no garantizaré que esto funcione en el navegador cruzado, creo que es aceptable soltar caracteres rotos). Para obtener un personaje válido, debe usar "".substring(0,2).

  • puedo forzar al navegador a utilizar solamente codificación UTF-8?

La mejor manera de hacer esto es para entregar su página en UTF-8. Asegúrese de que su servidor web esté enviando los encabezados Content-type: text/html; charset=UTF-8 apropiados. Es posible que también desee insertar un elemento <meta charset="UTF-8"> en su elemento <head>, para los casos en que el Content-Type no se establece correctamente (como si su página se carga fuera del disco local).

  • ¿Cómo puedo codificar codificaciones arbitrarias a UTF-8 Asumo que es una biblioteca JavaScript para esto?

No hay mucha necesidad en JavaScript para codificar texto en codificaciones particulares. Si simplemente está escribiendo en el DOM, o leyendo o completando controles de formulario, debe usar cadenas de JavaScript que se tratan como secuencias de unidades de código UTF-16. XMLHTTPRequest, cuando se utiliza para send(data) a través de POST, utilizará UTF-8 (si pasa un documento con una codificación diferente declarada en la declaración <?xml ...>, puede o no convertir eso a UTF-8, por lo que para compatibilidad generalmente no debería ' usar cualquier cosa que no sea UTF-8).

+0

+1, excelente respuesta, gracias! –

+1

Es ampliamente aceptado que los navegadores web piensan que ISO-8859-1 es cp1252, y esta no es la razón por la que 'accept-charset' está roto. Lo que IE realmente hace es tratar 'accept-charset' como solo un * backup charset * para usar cuando el juego de caracteres tomado de la página no puede contener el contenido del campo de formulario. Eso significa que cuando se envía su formulario no puede saber si IE utilizó la codificación de página o la codificación 'accept-charset' para codificar un campo de formulario (de hecho, es probable que tenga una mezcla en el formulario). Esto hace que sea imposible recuperar los caracteres originales. – bobince

+0

OK, hemos eliminado la referencia a 'accept-charset'; después de algunas investigaciones, he visto varias fuentes describir los errores de forma diferente, no tengo todas las versiones relevantes de IE en frente de mí para probar, y no es necesario de todos modos si configura la codificación de caracteres en toda la página para UTF -8. –

1

El texto en un cuadro de texto no está codificado de ninguna manera; es "texto", una serie abstracta de personajes. En casi todas las aplicaciones contemporáneas, ese texto se expresa como una secuencia de puntos de código Unicode, que son enteros mapeados a caracteres abstractos particulares. El texto no se "codifica" hasta que se convierte en una secuencia de bytes, como cuando se envía el formulario. En ese momento, la codificación está determinada por la codificación de la página HTML en la que aparece el formulario, o por el atributo accept-charset del elemento de formulario.

+0

¿Qué ocurre si quiero convertir el valor de ese formulario a su equivalente hexadecimal en forma de cadena? ¿Qué codificación ve ECMAScript? –

+1

@ e5 Como dije en mi respuesta, las cadenas en JavaScript aparecen como secuencias de unidades de código UTF-16. Si accede a un carácter de cadena por carácter, o verifica su longitud, verá puntos de código sustituto si tiene caracteres más allá del BMP. –

+0

@Brian Campbell, gracias por la respuesta rápida. ¿Qué son los puntos de código sustituto? ¿Cuál es la relación entre los valores hexadecimales para un carácter utf-16 y los códigos de char que javascript te da? –

4

quisiera asegurar que todo el texto introducido en el cuadro se codifica ya sea en texto UTF-8

en un DOM HTML que incluye campos de entrada no tiene ninguna codificación de bytes intrínseca; se almacena como caracteres Unicode (específicamente, en un nivel estándar DOM y ECMAScript, unidades de código UTF-16; en el raro caso de que use caracteres fuera del plano multilingüe básico, es posible ver la diferencia, por ejemplo, ''.length es 2).

Es solo cuando se envía el formulario que el texto se serializa en bytes utilizando una codificación particular, de manera predeterminada la misma codificación que se usó para analizar la página. Debería servir su página que contiene el formulario como UTF-8 (a través de Content-Type encabezado charset parámetro y/o etiqueta equivalente <meta>).

Aunque en principio hay una anulación para esto en el atributo accept-charset del elemento <form>, no funciona correctamente (y es activamente nocivo en muchos casos) en IE. Entonces evite ese.

No hay funciones explícitas de manejo de codificación disponibles en JavaScript. Puede hackear juntos un codificador Unicode-a-UTF-8-bytes encadenando unescape(encodeURIComponent(str)) (y de forma similar al revés con la función inversa), pero eso es todo.

+0

+1 para esa palabra en negrita. – BalusC

+0

He visto unescape (encodeURIComponent (str)) anteriormente, pero me preocupaba que no funcionara en todos los casos. –

+0

Es sólido, y prácticamente lo único para lo que se debe usar escape/unescape (incluso entonces, es bastante raro que alguna vez lo necesites). – bobince

Cuestiones relacionadas