我在一些地方读到JavaScript字符串是UTF-16,而在其他地方它们是UCS-2。我做了一些搜索,试图找出区别,发现如下:
问:UCS-2和UTF-16之间有什么区别?
答:UCS-2是一个过时的术语,指的是在替代码位和UTF-16被添加到2.0版标准之前,Unicode 1.1之前的Unicode实现。现在应该避免使用这个术语。
UCS-2没有定义不同的数据格式,因为UTF-16和UCS-2在数据交换方面是相同的。两者都是16位,并且具有完全相同的代码单元表示。
过去,有时实作会标示为“UCS-2”,表示它不支援增补字符,也不会将Surrogate字码指标对解译为字符。这样的实作不会行程增补字符的字符属性、字码指标界限、定序等。
通过: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/显示器
EDIT:对于任何可能遇到此问题的人,请务必查看此链接:
4条答案
按热度按时间lskq00tm1#
JavaScript,严格地说,ECMAScript,早于Unicode 2.0,所以在某些情况下,你可能会发现UCS-2的引用,只是因为它在写引用的时候是正确的。你能给我们指出JavaScript是“UCS-2”的具体引用吗?
ECMAScript版本3和5的规范至少都显式声明
String
为无符号16位整数的集合,并且如果这些整数值用于表示文本数据,则它们是UTF-16代码单元。请参见EDIT:我不再确定我的答案是否完全正确。请参阅excellent article mentioned above,它本质上是说,虽然JavaScript引擎可能在内部使用UTF-16,而且大多数引擎都是这样做的,但语言本身实际上将这些字符暴露出来,就像它们是UCS-2一样。
o8x7eapl2#
它是UTF-16/USC-2。它可以处理代理对,但是
charAt
/charCodeAt
返回一个16位字符,而不是Unicode码点。如果你想让它处理代理对,我建议你快速阅读一下this。fcwjkofz3#
它只是一个16位的值,没有在ECMAScript标准中指定编码。
请参见本文档中的第7.8.4节“字符串文字”:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
ruarlubt4#
自2012年以来,情况发生了变化。JavaScript字符串现在是UTF-16。是的,旧的字符串方法仍然适用于16位代码单元,但语言现在可以识别UTF-16代理,并且知道如果使用string iterator该怎么做。还有Unicode regex support。