JavaScript字符串- UTF-16与UCS-2?

g6baxovj  于 2022-10-30  发布在  Java
关注(0)|答案(4)|浏览(162)

我在一些地方读到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:对于任何可能遇到此问题的人,请务必查看此链接:

http://mathiasbynens.be/notes/javascript-encoding

lskq00tm

lskq00tm1#

JavaScript,严格地说,ECMAScript,早于Unicode 2.0,所以在某些情况下,你可能会发现UCS-2的引用,只是因为它在写引用的时候是正确的。你能给我们指出JavaScript是“UCS-2”的具体引用吗?
ECMAScript版本35的规范至少都显式声明String为无符号16位整数的集合,并且如果这些整数值用于表示文本数据,则它们是UTF-16代码单元。请参见

o8x7eapl

o8x7eapl2#

它是UTF-16/USC-2。它可以处理代理对,但是charAt/charCodeAt返回一个16位字符,而不是Unicode码点。如果你想让它处理代理对,我建议你快速阅读一下this

fcwjkofz

fcwjkofz3#

它只是一个16位的值,没有在ECMAScript标准中指定编码。
请参见本文档中的第7.8.4节“字符串文字”:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

ruarlubt

ruarlubt4#

自2012年以来,情况发生了变化。JavaScript字符串现在是UTF-16。是的,旧的字符串方法仍然适用于16位代码单元,但语言现在可以识别UTF-16代理,并且知道如果使用string iterator该怎么做。还有Unicode regex support

// Before
"😀😂💩".length // 6

// Now
[..."😀😂💩"].length // 3
[..."😀😂💩"]  // [ '😀', '😂', '💩' ]
[... "😀😂💩".matchAll(/./ug) ] // 3 matches as above

// Regexes support unicode character classes
"café".normalize("NFD").match(/\p{L}\p{M}/ug) // [ 'é' ]

// Extract code points
[..."😀😂💩"].map(char => char.codePointAt(0).toString(16)) // [ '1f600', '1f602', '1f4a9' ]

相关问题