繁体   English   中英

默认 Javascript 字符编码?

[英]Default Javascript Character Encoding?

经过一番疯狂的谷歌搜索后,我似乎无法找到一个简单问题的结论性答案。 如果这个问题在某处得到回答,我深表歉意,但如果是这样,我找不到它。

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

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

通过我的经验测试(更改不同的设置,然后在一个足够奇怪的字符上使用charCodeAt并查看该值与哪种编码匹配)它似乎总是 UTF-8 或 UTF-16,但我不知道为什么.

谢谢您的帮助!

E262 第 8.4 节:

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

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

这种措辞有点令人生厌。 这似乎意味着所有重要的东西都将字符串视为每个字符都是 UTF-16 字符,但同时没有任何东西可以确保它都是有效的。

编辑- 明确地说,目的是字符串由 UTF-16 代码点组成。 在 ES2015 中,“字符串值”的定义包括这个注释:

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

因此,即使字符串包含不能作为正确 unicode 字符工作的值,它仍然是一个字符串。

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

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

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

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

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

如果 JavaScript 程序通过script元素或某些事件属性显示为嵌入在 HTML 中,那么其字符编码当然与 HTML 文档的字符编码相同。 指定的字符编码的HTML 4.01规范定义的解决机制,按照该顺序: charset在HTTP头中, charsetmetacharset在一个链接,随后访问的文件,最后启发式(猜测),其可以涉及许多事情,许多东西; 参见 HTML5 草案中复杂的解析机制

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM