我在某些地方读过JavaScript字符串是UTF-16,而在其他地方,他们是UCS-2。我做了一些搜索,试图弄清楚差异,发现了这个:
问:UCS-2和UTF-16有什么区别?
答:UCS-2是过时的术语,指的是Unicode 在代理代码点和之前执行到Unicode 1.1 UTF-16被添加到该标准的2.0版本中。这个词现在应该 要避免。
UCS-2没有定义不同的数据格式,因为UTF-16和UCS-2 对于数据交换而言是相同的。两者都是16位,并且有 完全相同的代码单元表示。
有时在过去,实施已被标记为" UCS-2"至 表示它不支持补充字符,也不支持 将代理代码点对解释为字符。这样的 实现不会处理字符属性的处理, 补充字符的代码点边界,整理等。
via:http://www.unicode.org/faq/utf_bom.html#utf16-11
所以我的问题是,是因为JavaScript字符串对象的方法和索引作用于16位数据值而不是字符,这使得有些人认为它是UCS-2?如果是这样,围绕字符而不是16位数据块的JavaScript字符串对象是否会被视为UTF-16?或者还有其他我想念的东西?
编辑:根据要求,以下是一些来源,说JavaScript字符串是UCS-2:
http://blog.mozilla.com/nnethercote/2011/07/01/faster-javascript-parsing/ http://terenceyim.wordpress.com/tag/ucs2/
编辑:对于可能遇到此问题的任何人,请务必查看以下链接:
答案 0 :(得分:18)
严格来说,JavaScript,ECMAScript,早于Unicode 2.0,因此在某些情况下,您可能会发现对UCS-2的引用只是因为在编写引用时这是正确的。您能否指出我们将JavaScript作为“UCS-2”的具体引用?
ECMAScript版本3和5的规范至少都明确声明一个String是一个无符号16位整数的集合,如果那些整数值是用来表示文本数据,那么它们就是UTF -16代码单元。参见the ECMAScript Language Specification的第8.4节。
编辑:我不再确定我的回答是完全正确的。请参阅上面提到的优秀文章http://mathiasbynens.be/notes/javascript-encoding,其实质上是说虽然JavaScript引擎可以在内部使用UTF-16,但大多数情况下,语言本身会有效地将这些字符暴露为UCS-2。
答案 1 :(得分:8)
这是UTF-16 / USC-2。它可以处理代理项对,但charAt
/ charCodeAt
返回一个16位字符而不是Unicode代码点。如果你想让它处理代理对,我建议你快速阅读this。
答案 2 :(得分:2)
它只是一个16位值,ECMAScript标准中没有指定编码。
请参阅本文档中的7.8.4字符串文字:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf