special - javascript escape characters
Codificación de caracteres Javascript por defecto? (2)
Después de algunas búsquedas frenéticas en Google, parece que no puedo encontrar una respuesta concluyente a una pregunta simple. Pido disculpas si esta pregunta es respondida en alguna parte, pero si es así no pude encontrarla.
Mientras escribía un método de cifrado en Javascript, llegué a preguntarme qué tipo de codificación de caracteres usaban mis cadenas y por qué.
Entonces, ¿qué determina la codificación de caracteres en Javascript? ¿Es un estándar? ¿Por el navegador? ¿Determinado por el encabezado de la solicitud HTTP? ¿En la etiqueta <META>
de HTML que lo abarca? ¿El servidor que alimenta la página?
Según mis pruebas empíricas (cambiar diferentes configuraciones, luego usar charCodeAt
en un carácter suficientemente extraño y ver con qué codificación coincide el valor) parece ser siempre UTF-8 o UTF-16, pero no estoy seguro de por qué .
¡Gracias por la ayuda!
No existe una codificación de caracteres predeterminada para JavaScript como tal. Un programa de JavaScript es, en lo que respecta a las especificaciones, una secuencia de caracteres abstractos. Cuando se transmiten a través de una red, o simplemente se almacenan en una computadora, los caracteres abstractos deben codificarse de alguna manera, pero los mecanismos para ello no están controlados por el estándar ECMAScript.
La sección 6 del estándar ECMAScript usa UTF-16 como una codificación de referencia, pero no lo designa por defecto. Usar UTF − 16 como referencia es lógicamente innecesario (sería suficiente para referirse a los números de Unicode) pero probablemente se suponía que ayudaba a las personas.
Este problema no debe confundirse con la interpretación de literales de cadena o cadenas en general. Un literal como ''Φ'' debe estar en alguna codificación, junto con el resto del programa; esto puede ser cualquier codificación, pero después de que se haya resuelto la codificación, el literal se interpretará como un número entero de acuerdo con el número Unicode del carácter.
Cuando un programa de JavaScript se transmite como tal (como un "archivo JavaScript externo") a través de Internet, se aplica RFC 4329 , Scripting Media Types. La cláusula 4 define el mecanismo: Principalmente, se verifican los encabezados, como los encabezados HTTP, y se confía en un parámetro de charset
. (En la práctica, los servidores web generalmente no especifican este parámetro para los programas de JavaScript). En segundo lugar, se aplica la detección de la lista de materiales. En su defecto, se implica UTF-8.
La primera parte del mecanismo es algo ambigua. Puede interpretarse como relacionado con el parámetro charset
en un encabezado HTTP real, o puede extenderse a los parámetros charset
en los elementos del script
.
Si un programa JavaScript aparece como incrustado en HTML, ya sea a través de un elemento de script
o algún atributo de evento, su codificación de caracteres es, por supuesto, la misma que la del documento HTML. La sección Especificar la codificación de caracteres de la especificación HTML 4.01 define el mecanismo de resolución, en este orden: charset
de charset
en el encabezado HTTP, charset
de charset
en meta
, charset
de charset
en un enlace que se siguió para acceder al documento, y finalmente heurística (conjeturas), que puede incluir muchas cosas; cf. Al complejo mecanismo de resolución en el borrador de HTML5 .
Sección 8.4 de E262:
El tipo de cadena es el conjunto de todas las secuencias ordenadas finitas de cero o más valores enteros sin signo de 16 bits ("elementos"). El tipo de cadena se usa generalmente para representar datos textuales en un programa ECMAScript en ejecución, en cuyo caso cada elemento de la cadena se trata como un valor de unidad de código (consulte la Cláusula 6). Se considera que cada elemento ocupa una posición dentro de la secuencia. Estas posiciones están indexadas con enteros no negativos. El primer elemento (si existe) está en la posición 0, el siguiente elemento (si existe) en la posición 1, y así sucesivamente. La longitud de una cadena es el número de elementos (es decir, valores de 16 bits) dentro de ella. La cadena vacía tiene longitud cero y, por lo tanto, no contiene elementos.
Cuando una cadena contiene datos textuales reales, cada elemento se considera una unidad de código UTF-16. Ya sea que este sea o no el formato de almacenamiento real de una Cadena, los caracteres dentro de una Cadena están numerados por la posición del elemento de su unidad de código inicial como si estuvieran representados usando UTF-16. Todas las operaciones en cadenas (excepto que se indique lo contrario) las tratan como secuencias de enteros sin signo de 16 bits no diferenciados; no aseguran que la Cadena resultante esté en forma normalizada, ni aseguran resultados sensibles al idioma.
Esa redacción es un poco comedida; parece significar que todo lo que cuenta trata las cadenas como si cada carácter fuera un carácter UTF-16, pero al mismo tiempo, nada garantiza que todo sea válido.
Editar : para que quede claro, la intención es que las cadenas consten de puntos de código UTF-16. En ES2015, la definición de "valor de cadena" incluye esta nota:
Un valor de cadena es un miembro del tipo de cadena. Cada valor entero en la secuencia generalmente representa una sola unidad de 16 bits de texto UTF-16. Sin embargo, ECMAScript no impone restricciones ni requisitos a los valores, excepto que deben ser enteros sin signo de 16 bits.
Por lo tanto, una cadena sigue siendo una cadena incluso cuando contiene valores que no funcionan como caracteres Unicode correctos.