Nic*_*ick 37 html javascript character-encoding
经过一些疯狂的谷歌搜索,我似乎无法找到一个简单问题的结论性答案.如果这个问题在某个地方得到解答,我道歉,但如果是这样,我就找不到了.
在Javascript中编写加密方法时,我开始想知道我的字符串使用了什么字符编码,以及为什么.
那么:什么决定了Javascript中的字符编码?这是一个标准吗?通过浏览器?由HTTP请求的标头决定?在<META>包含它的HTML标签中?提供页面的服务器?
通过我的经验测试(改变不同的设置,然后使用charCodeAt一个足够奇怪的字符并查看值匹配的编码),它似乎总是UTF-8或UTF-16,但我不确定为什么.
谢谢您的帮助!
Poi*_*nty 27
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字符,字符串仍然是字符串.
Juk*_*ela 12
JavaScript没有默认的字符编码.就规范而言,JavaScript程序是一系列抽象字符.当通过网络传输或仅存储在计算机中时,必须以某种方式对抽象字符进行编码,但其机制不受ECMAScript标准的控制.
ECMAScript标准的第6节使用UTF-16作为参考编码,但未将其指定为默认值.使用UTF-16作为参考在逻辑上是不必要的(只需要引用Unicode数字),但它可能被认为可以帮助人们.
不应将此问题与字符串文字或字符串的解释混淆.像'Φ'这样的字面需要与程序的其余部分一起进行某种编码; 这可以是任何编码,但在解码完编码后,文字将根据字符的Unicode编号解释为整数.
当JavaScript程序通过Internet传输(如"外部JavaScript文件")时,RFC 4329,脚本媒体类型适用.第4节定义了机制:首先,检查诸如HTTP头之类的标题,并且charset将信任其中的参数.(实际上,Web服务器通常不为JavaScript程序指定这样的参数.)其次,应用BOM检测.如果不这样做,就暗示了UTF-8.
该机制的第一部分有些含糊不清.它可能被解释为仅与charset实际HTTP标头中的参数相关,或者可能会扩展为元素中的charset参数script.
如果JavaScript程序通过script元素或某个事件属性显示为嵌入在HTML中,则其字符编码当然与HTML文档的编码相同.部分指定 HTML 4.01规范的字符编码按以下顺序定义解析机制:charset在HTTP头charset中meta,charset在跟踪访问文档的链接中,最后是启发式(猜测),这可能涉及许多事情; 比照 HTML5草案中的复杂解决机制.