No hay 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 de la norma ECMAScript usa UTF-16 como codificación de referencia, pero no la designa como predeterminada. 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 se debe confundir con la interpretación de cadenas literales 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 entero de acuerdo con el número Unicode del personaje.
Cuando se transmite un programa 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, se verifican los encabezados, como los encabezados HTTP, y se confiará en un parámetro charset
. (En la práctica, los servidores web generalmente no especifican tal parámetro para los programas 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 charset
en un encabezado HTTP real solamente, o podría extenderse a los parámetros charset
en los elementos script
.
Si un programa JavaScript aparece como incrustado en HTML, ya sea a través de un elemento script
o algún atributo de evento, entonces su codificación de caracteres es, por supuesto, la misma que la del documento HTML. La sección Specifying the character encoding de la especificación de HTML 4.01 define el mecanismo de resolución, en este orden: charset
en el encabezado HTTP, charset
en , charset
en un enlace que se siguió para acceder al documento, y finalmente heurística (conjetura), que puede involucrar muchas cosas; cf. al complejo resolution mechanism in the HTML5 draft.
Las cadenas de JavaScript siempre son UTF-16. – Pointy
Supongo que esa es solo la respuesta. Por favor, ¿dónde está esto documentado? –
Estoy tratando de identificarlo en el documento ECMA-262 ahora :-) – Pointy