默认的Javascript字符编码?

时间:2012-06-21 15:07:48

标签: javascript html character-encoding

经过一些疯狂的谷歌搜索后,我似乎无法找到一个简单问题的确凿答案。如果这个问题在某个地方得到解答,我道歉,但如果是这样,我就找不到了。

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

那么:什么决定了Javascript中的字符编码?这是一个标准吗?通过浏览器?由HTTP请求的标头决定?在包含它的HTML的<META>标记中?提供页面的服务器?

通过我的经验测试(更改不同的设置,然后在一个足够奇怪的角色上使用charCodeAt并查看值匹配的编码),它似乎总是UTF-8或UTF-16,但我'我不确定为什么

感谢您的帮助!

2 个答案:

答案 0 :(得分:26)

E262第8.4节:

  

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

     

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

这句话很狡猾;它似乎意味着所有重要的事情都将字符串视为每个字符都是UTF-16字符,但同时没有任何东西可以确保它们都是有效的。

编辑 - 要清楚,意图是字符串由UTF-16代码点组成。在ES2015中,“字符串值”的定义包括以下注释:

  

String值是String类型的成员。序列中的每个整数值通常表示单个16位UTF-16文本单元。但是,ECMAScript不会对值赋予任何限制或要求,除非它们必须是16位无符号整数。

因此,即使字符串包含的值不是正确的unicode字符,字符串仍然是字符串。

答案 1 :(得分:11)

JavaScript没有默认的字符编码。就规范而言,JavaScript程序是一系列抽象字符。当通过网络传输或者只是存储在计算机中时,必须以某种方式对抽象字符进行编码,但其机制不受ECMAScript标准的控制。

ECMAScript标准的第6节使用UTF-16作为参考编码,但未将其指定为默认值。使用UTF-16作为参考在逻辑上是不必要的(只需要引用Unicode数字),但它可能被认为可以帮助人们。

这个问题不应该与字符串文字或字符串的解释混淆。像'Φ'这样的字面需要与程序的其余部分一起进行某种编码;这可以是任何编码,但在解码编码后,文字将根据字符的Unicode编号解释为整数。

当通过Internet传输JavaScript程序(作为“外部JavaScript文件”)时,适用RFC 4329脚本媒体类型。第4节定义了机制:首先,检查诸如HTTP头之类的标头,并且将信任charset参数。 (实际上,Web服务器通常不为JavaScript程序指定这样的参数。)其次,应用BOM检测。如果不这样做,就暗示了UTF-8。

该机制的第一部分有些含糊不清。它可能被解释为仅与实际HTTP标头中的charset参数相关,或者可能会扩展为charset元素中的script参数。

如果JavaScript程序在HTML中嵌入,可以通过script元素或某些事件属性,那么它的字符编码当然与HTML文档的编码相同。 HTML 4.01规范的Specifying the character encoding部分按以下顺序定义解析机制:HTTP标头中的charsetcharset中的meta,链接中的charset跟着访问文档,最后是启发式(猜测),可能涉及很多事情;比照复杂的resolution mechanism in the HTML5 draft