Tengo un cuadro html con el que los usuarios pueden introducir texto. Me gustaría asegurarme de todo el texto introducido en el cuadro es codificado en UTF-8 o convertir a UTF-8 cuando un usuario termina de escribir. Por otra parte, no acabo de entender cómo los diversos codificación UTF son elegidos cuando se introducen en un cuadro de texto.

En general, me siento curiosidad acerca de lo siguiente:

  • ¿Cómo funciona un navegador determinar que las codificaciones de uso cuando un usuario escribe en un cuadro de texto?
  • Cómo puede javascript determinar la codificación de una cadena de valor en un cuadro de texto html?
  • Puedo forzar al navegador a sólo usar la codificación UTF-8?
  • ¿Cómo puedo codificar arbitraria de la codificación a UTF-8 asumo que no es una biblioteca de JavaScript para esto?

** Edit **

Eliminado algunas preguntas innecesarias a mis metas.

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

  • Eso es un montón de preguntas! Qué tenemos que responder a todos a publicar una respuesta?
  • Byers no en todos, siento que están relacionados con el problema que estoy tratando de resolver. Respuestas a las primeras 4 preguntas me puso más cerca de mi solución.

3 Comentarios

  1. 16
    • ¿Cómo funciona un navegador determinar que las codificaciones de uso cuando un usuario escribe en un cuadro de texto?

    Utiliza la codificación de la página fue decodificado como por defecto. De acuerdo a la especificación, usted debe ser capaz de reemplazar esto con el accept-charset atributo de la <form> elemento, pero IE está libre de errores, así que usted no debe confiar en esto (yo he visto varias de diferentes fuentes describen varios bugs, y no tengo todas las versiones de IE en frente de mí para probar, así que voy a dejar en que).

    • Cómo puede javascript determinar la codificación de una cadena de valor en un cuadro de texto html?

    Todas las cadenas en JavaScript son codificados en UTF-16. El navegador de mapa de todo en UTF-16 para JavaScript, y de la codificación UTF-16 en lo que la página está codificada en.

    UTF-16 es un sistema de codificación que creció fuera de UCS-2. Originalmente, se pensaba que 65.536 puntos de código sería suficiente para que todos los de Unicode, por lo que una de 16 bits de codificación de caracteres sería suficiente. Resultó que el no es el caso, y así el conjunto de caracteres que se amplió a 1,114,112 puntos de código. En el fin de mantener la compatibilidad hacia atrás, algunos sin usar los rangos de caracteres de 16 bits fueron dejadas de lado por los pares suplentes, en el que dos de 16 bits unidades de código se utiliza para codificar un carácter único. Leer sobre UTF-16 y UCS-2 en la Wikipedia para más detalles.

    El resultado de todo esto es que cuando usted tiene una cadena de str en JavaScript, str.length no te da el número de caracteres, se le da el número de unidades de código, donde dos unidades de código puede ser usado para codificar un carácter único, si el personaje no está en el Plano Multilingüe Básico. Por ejemplo, "abc".length te da 3, pero "𐤀𐤁𐤂".length le da 6; y "𐤀𐤁𐤂".substring(0,1) da lo que parece ser una cadena vacía, ya que la mitad de un par suplente no se puede mostrar, pero la cadena que todavía contiene caracteres no válidos (no voy a garantizar que esto funciona con todos los navegadores; creo que es aceptable para soltar roto caracteres). Para obtener un carácter válido, debe utilizar "𐤀𐤁𐤂".substring(0,2).

    • Puedo forzar al navegador a sólo usar la 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á envío de los correspondientes Content-type: text/html; charset=UTF-8 encabezados. Puede que también desee incrustar un <meta charset="UTF-8"> elemento en su <head> elemento, para los casos en que la Content-Type no consigue establecer correctamente (como si la página se carga fuera de la disco local).

    • ¿Cómo puedo codificar arbitraria de la codificación a UTF-8 asumo que no es una biblioteca de JavaScript para esto?

    No hay mucha necesidad en JavaScript para codificar el texto en particular codificaciones. Si usted simplemente está escrito el DOM, o de la lectura o de relleno en los controles de formulario, usted sólo debe utilizar JavaScript cadenas que son tratados como secuencias de código UTF-16 unidades. XMLHTTPRequest, cuando se utiliza para send(data) a través de correo, se utiliza la codificación UTF-8 (si se le pasa un documento con una codificación diferente declarado en el <?xml ...> declaración, que puede o no puede convertir a UTF-8, por lo que la compatibilidad en general, usted no debería usar otra cosa que la codificación UTF-8).

    • +1, gran respuesta, gracias!
    • Es ampliamente aceptado que los navegadores web creo ISO-8859-1 es cp1252, y esta no es la razón accept-charset está roto. Lo que es decir, en realidad hace es tratar accept-charset como sólo un copia de seguridad del juego de caracteres para usar cuando el conjunto de caracteres tomados de la página en sí, no puede mantener el contenido del campo de formulario. Eso significa que cuando el formulario es enviado, usted no puede saber si IE usa la codificación de la página o el accept-charset de codificación para codificar un campo de formulario (de hecho, es probable que usted tenga una mezcla a través de la forma). Esto hace que sea imposible recuperar los caracteres originales.
    • OK, han eliminado la referencia a accept-charset; después de algunas investigaciones, he visto varias fuentes describen los errores de forma diferente, no tengo todas las versiones de IE en frente de mí para probar, y no es necesario de todos modos si usted establecer su codificación de caracteres en toda la página a UTF-8.
    • Excelente respuesta. Además, en el final, el servidor de aceptar el puesto será responsable en última instancia de validación y filtrado de contenido Publicado. Debido a que no se puede garantizar que el cliente la presentación de los POST que realmente se ejecutó javascript.
  2. 4

    Me gustaría asegurarme de todo el texto introducido en el cuadro es codificado en UTF-8

    De texto en HTML DOM incluyendo campos de entrada no tiene intrínseca byte de codificación; se almacena como caracteres Unicode (en concreto, en un DOM y ECMAScript nivel estándar, código UTF-16 unidades; en el raro caso de que usted utilice caracteres fuera del Plano Multilingüe Básico es posible ver la diferencia, por ejemplo. '𝅘𝅥𝅯'.length es 2).

    Es sólo cuando se envía el formulario que el texto es serializado en bytes mediante una codificación particular, por defecto, la misma codificación que se utilizó para analizar la página, Así que usted debe servir a su página que contiene el formulario como UTF-8 (a través de Content-Type encabezado charset parámetro y/o equivalente <meta> etiqueta).

    Mientras que en un principio no es un reemplazo para este en el accept-charset atributo de la <form> elemento, no funciona correctamente (y es activamente perjudicial en muchos casos) en el IE. Así evitar que uno.

    No hay ninguna codificación explícita la gestión de las funciones disponibles en JavaScript sí mismo. Puedes hackear una Unicode a UTF-8 bytes de encoder por el encadenamiento de unescape(encodeURIComponent(str)) (y lo mismo a la inversa con la función inversa), pero de eso se trata.

    • +1 para que la palabra en negrita.
    • He visto unescape(encodeURIComponent(str)) antes, pero me preocupa que no funcione en todos los casos.
    • Es sólida, y casi la única cosa de escape/unescape nunca debe ser utilizado para (incluso entonces, es muy raro que alguna vez lo necesitan).
    • unescape ha sido despreciado en favor de decodeURI. Consulte de este MODO la pregunta para más información.
    • usted no puede utilizar decodeURI para este propósito, que no tiene nada que ver con URIs. Manta-sustitución de unescape con decodeURI[Component] no es una buena idea, a menos que usted está seguro que fue utilizado en error cuando URI-decodificación que se entiende, y está seguro de que usted no tiene escape de datos que podría conseguir alterados por el cambio. Estas funciones están ahora en la «web browser legado características» anexo pero eso no significa que estén en desuso o propensos a desaparecer pronto. El nuevo mundo de reemplazo para este propósito específico, es el Codificación de la API, pero el soporte es muy baja en la actualidad.
  3. 1

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

    • Entonces, ¿qué si quiero convertir el valor de esa forma es equivalente hexadecimal en forma de cadena? Lo que la codificación no ECMAScript ver?
    • Como he dicho en mi respuesta, cadenas en JavaScript aparecen como secuencias de código UTF-16 unidades. Si usted tiene acceso a una cadena, carácter por carácter, o comprobar que la longitud sustituto de puntos de código si usted tiene personajes más allá de la BMP.
    • Campbell, Gracias por la rápida respuesta. ¿Cuáles son sustituto de puntos de código? ¿Cuál es la relación entre los valores hexadecimales para una de caracteres utf-16 y el char códigos javascript que te da?
    • e5: Que son el mismo. JavaScript (ECMAScript estándar) y DOM (W3C DOM Nivel 1 b) especificar código UTF-16 unidades como el carácter básico tipo. Un sustituto de la unidad de código es parte de un ‘par suplente’ que codifica un carácter Unicode (punto de código) en dos de código UTF-16 unidades. Esta fealdad, fue necesaria porque después de un par de versiones de Unicode se hizo evidente que 65536 caracteres que simplemente no eran suficientes. Muchos de los sistemas de uso de código UTF-16 unidades en su cadena básica tipo, incluyendo Java y Windows. Otros, tales como Linux y Python puede sustentar un mayor tipo de cadena que no necesita de los sustitutos.
    • se puede añadir esta información a su respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here