在编写JavaScript加密方法时,我想知道我的字符串使用的是什么字符编码以及为什么。
是什么决定了JavaScript中的字符编码?它是一个标准吗?由浏览器决定?由HTTP请求的头部确定?在包含它的HTML的<META>
标签中?还是由提供页面的服务器确定?
通过我的实验测试(更改不同的设置,然后对足够奇怪的字符使用charCodeAt
并查看值匹配的编码),它似乎总是UTF-8或UTF-16,但我不确定为什么。
经过一番疯狂的谷歌搜索,我似乎找不到这个简单问题的确切答案。
在编写JavaScript加密方法时,我想知道我的字符串使用的是什么字符编码以及为什么。
是什么决定了JavaScript中的字符编码?它是一个标准吗?由浏览器决定?由HTTP请求的头部确定?在包含它的HTML的<META>
标签中?还是由提供页面的服务器确定?
通过我的实验测试(更改不同的设置,然后对足够奇怪的字符使用charCodeAt
并查看值匹配的编码),它似乎总是UTF-8或UTF-16,但我不确定为什么。
经过一番疯狂的谷歌搜索,我似乎找不到这个简单问题的确切答案。
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字符的值,它仍然是一个字符串。
charset
参数将受到信任。(实际上,Web服务器通常不会为JavaScript程序指定此类参数。)其次,应用BOM检测。如果失败,则暗示UTF-8。charset
参数,也可能被扩展到script
元素中的charset
参数。