JavaScript 的默认字符编码是什么?

44

在编写JavaScript加密方法时,我想知道我的字符串使用的是什么字符编码以及为什么。

是什么决定了JavaScript中的字符编码?它是一个标准吗?由浏览器决定?由HTTP请求的头部确定?在包含它的HTML的<META>标签中?还是由提供页面的服务器确定?

通过我的实验测试(更改不同的设置,然后对足够奇怪的字符使用charCodeAt并查看值匹配的编码),它似乎总是UTF-8或UTF-16,但我不确定为什么。

经过一番疯狂的谷歌搜索,我似乎找不到这个简单问题的确切答案。


5
JavaScript字符串始终采用UTF-16编码。 - Pointy
2
我猜那就是答案了。请问,这在哪里有记录? - Nick
我现在正在尝试在ECMA-262文档中找到它的位置 :-) - Pointy
谢谢!如果只是这样,请将其作为答案提交。 - Nick
JSON的默认编码是UTF-8。 - Peter Mortensen
2个回答

29

E262 第8.4节:

字符串类型是所有由零个或多个16位无符号整数值(“元素”)组成的有限有序序列。字符串类型通常用于表示运行中的ECMAScript程序中的文本数据,在此情况下,字符串中的每个元素都被视为一个代码单元值(见第6条)。每个元素被认为在序列中占据一个位置。这些位置用非负整数进行索引。第一个元素(如果有)位于位置0,下一个元素(如果有)位于位置1,依此类推。字符串的长度是其中的元素数量(即16位值)。空字符串的长度为零,因此不包含任何元素。

当一个字符串包含实际的文本数据时,每个元素都被视为单个UTF-16代码单元。无论这是否是字符串的实际存储格式,字符串内的字符都按照它们的初始代码单元元素位置编号,就好像使用UTF-16表示它们一样。除非另有说明,否则对字符串的所有操作都将其视为未区分的16位无符号整数序列;它们不会确保结果字符串处于规范化形式,也不会确保具有语言敏感性的结果。

这种措辞似乎有点含糊,它似乎意味着所有计算都将字符串视为每个字符都是UTF-16字符,但同时也没有确保它们都有效。

明确一点,意图是字符串由UTF-16码点组成。在ES2015中,“字符串值”的定义包括以下说明:

字符串值是字符串类型的成员。序列中的每个整数值通常表示UTF-16文本的单个16位单位。但是,ECMAScript对这些值没有任何限制或要求,除了它们必须是16位无符号整数。

因此,即使字符串包含不符合正确Unicode字符的值,它仍然是一个字符串。


7
注意:每个元素都是UTF-16 _码位_。显然,代理对在字符串中会被计为两个字符,尽管它们编码了一个单一的Unicode字符。 - lanzz

14
作为规范,JavaScript程序是一系列抽象字符,因此没有默认的字符编码。当通过网络传输或仅存储在计算机中时,必须以某种方式对抽象字符进行编码,但其机制不受ECMAScript标准控制。ECMAScript标准的第6节使用UTF-16作为参考编码,但未将其指定为默认编码。使用UTF-16作为参考在逻辑上是不必要的(只需引用Unicode数字即可),但可能认为这样有助于人们。这个问题不应与字符串字面量或一般字符串的解释混淆。像'Φ'这样的字面量需要处于某种编码中,连同程序的其余部分;这可以是任何编码,但在解析编码后,该字面量将根据字符的Unicode编号被解释为整数。
当JavaScript程序作为“外部JavaScript文件”通过互联网传输时,适用RFC 4329,即脚本媒体类型。第4条款定义了机制:首先,检查诸如HTTP标头之类的标头,并且其中的charset参数将受到信任。(实际上,Web服务器通常不会为JavaScript程序指定此类参数。)其次,应用BOM检测。如果失败,则暗示UTF-8。
该机制的第一部分有些模糊。它可能被解释为仅涉及实际HTTP标头中的charset参数,也可能被扩展到script元素中的charset参数。
如果JavaScript程序嵌入HTML中,无论是通过

3
很有趣,但对我来说,这听起来更像是实际的Javascript文件本身将如何编码,而不是Javascript处理其代码中字符串文字的方式。我是否理解错了? - Nick
我的回答确实是关于JavaScript程序的字符编码。JavaScript字面量没有单独的字符编码:'abc'代表三个16位整数序列,它们是a、b和c的Unicode编号。如果看起来它们以某种方式“UTF-8编码”,以便在读取字符串时获得UTF-8字节,则存在一些误解。但对于Ascii字符,'a'代表一个16位整数,其中包含Ascii中'a'的8位字节和一个零字节,因此数据可能看起来像UTF-8编码。 - Jukka K. Korpela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接