¿Codificación predeterminada del carácter de Javascript?

Después de buscar Google desesperadamente, parece que no puedo encontrar una respuesta definitiva a una pregunta simple. Me disculpo si esta pregunta es respondida en alguna parte, pero si es así no pude encontrarla.

Mientras escribía un método de encriptación en Javascript, comencé a preguntarme qué carácter estaba usando la encoding de mis cadenas y por qué.

Entonces, ¿qué determina la encoding de caracteres en Javascript? ¿Es un estándar? Por el navegador? ¿Determinado por el encabezado de la solicitud HTTP? En la etiqueta de HTML que lo abarca? El servidor que alimenta la página?

Con mis pruebas empíricas (cambiando diferentes configuraciones, luego usando charCodeAt en un personaje suficientemente extraño y viendo con qué encoding coincide el valor) parece ser siempre UTF-8 o UTF-16, pero no estoy seguro de por qué .

¡Gracias por la ayuda!

Sección 8.4 de E262:

El tipo String es el conjunto de todas las secuencias ordenadas finitas de cero o más valores enteros sin signo de 16 bits (“elementos”). El tipo String generalmente se usa para representar datos textuales en un progtwig ECMAScript en ejecución, en cuyo caso cada elemento en la Cadena se trata como un valor de unidad de código (ver Cláusula 6). Cada elemento se considera que ocupa una posición dentro de la secuencia. Estas posiciones están indexadas con enteros no negativos. El primer elemento (si lo hay) está en la posición 0, el siguiente elemento (si corresponde) en la posición 1, y así sucesivamente. La longitud de una Cadena es la cantidad 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, se considera que cada elemento es una sola unidad de código UTF-16. Independientemente de que este sea el formato de almacenamiento real de una Cadena, los caracteres dentro de una Cadena se numeran por su posición inicial del elemento de la unidad de código como si estuvieran representados mediante UTF-16. Todas las operaciones en Strings (excepto que se indique lo contrario) las tratan como secuencias de enteros sin signo de 16 bits indiferenciados; no garantizan que la cadena resultante esté en forma normalizada, ni garantizan resultados sensibles al lenguaje.

Esa redacción es amable-de weasely; parece significar que todo lo que se considera 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 estén formadas por 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 sobre 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.

No hay encoding de caracteres predeterminada para JavaScript como tal. Un progtwig 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 encoding de referencia, pero no lo designa como predeterminado. El uso de UTF-16 como referencia es lógicamente innecesario (bastaría con referirse a los números Unicode), pero probablemente se asumió que ayudaba a las personas.

Este problema no debe confundirse con la interpretación de literales o cadenas de cadenas en general. Un literal como ‘Φ’ debe estar en alguna encoding, junto con el rest del progtwig; esto puede ser cualquier encoding, pero después de que se haya resuelto la encoding, el literal se interpretará como un entero de acuerdo con el número Unicode del personaje.

Cuando se transmite un progtwig de JavaScript como tal (como un “archivo JavaScript externo”) a través de Internet, se aplica RFC 4329 , Tipos de medios de secuencias de comandos. La cláusula 4 define el mecanismo: Principalmente, los encabezados tales como los encabezados HTTP están marcados, y un parámetro de charset será de confianza. (En la práctica, los servidores web generalmente no especifican tal parámetro para los progtwigs de JavaScript.) En segundo lugar, se aplica la detección de BOM. En su defecto, UTF-8 está implícito.

La primera parte del mecanismo es algo ambigua. Se podría interpretar como relacionado con el parámetro de charset de charset en un encabezado HTTP real solamente, o podría extenderse a los parámetros del charset de charset en los elementos del script .

Si un progtwig JavaScript aparece como incrustado en HTML, ya sea a través de un elemento script o algún atributo de evento, entonces su encoding de caracteres es, por supuesto, la misma que la del documento HTML. Sección Especificar la encoding de caracteres de la especificación HTML 4.01 define el mecanismo de resolución, en este orden: charset en el encabezado HTTP, charset en meta , charset en un enlace que se siguió para acceder al documento, y finalmente heurística (conjetura), que puede involucrar muchas cosas; cf. al complejo mecanismo de resolución en el borrador de HTML5 .