【问题标题】:JavaScript strings - UTF-16 vs UCS-2?JavaScript 字符串 - UTF-16 与 UCS-2?
【发布时间】:2012-02-01 17:05:06
【问题描述】:

我在某些地方读到 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”以 表示它不支持补充字符并且不 将代理代码点对解释为字符。这样一个 实现不会处理字符属性的处理, 补充字符的代码点边界、排序规则等。

通过: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/

编辑:对于可能遇到此问题的任何人,请务必查看此链接:

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

【问题讨论】:

    标签: javascript utf-16


    【解决方案1】:

    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。

    【讨论】:

    • 感谢您的链接,规范的语言似乎很清楚。我认为 UCS-2 讨论要么是旧的,要么是基于代理对的方法和索引支持。
    • 因此,规范声明“序列中的每个整数值通常代表一个 UTF-16 文本的 16 位单元。但是,ECMAScript 对这些值没有任何限制或要求,除了它们必须是 16 位无符号整数。”,这相当于说在现代 C 程序中,字符数组中的每个字符值“通常”代表 UTF-8 文本的单个 8 位单元,但显然说明 C 字符串“是”UTF-8 是错误的。 JavaScript 提供的语义只有 UCS-2;如果你想要 UTF-16 支持,你必须自己这样做,根据 DMoses 的回答。
    • UCS 是带有数字的东西,是的,UCS 2 已经过时,当前版本是 UCS 4。UTF-8/-16/-32 是用位表示 UCS 事物数组的方法。 ;)
    【解决方案2】:

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

    【讨论】:

    • “它可以处理代理对”是什么意思?
    • 如果您阅读链接的文章,它将描述如何让它处理代理对。我的观点是默认情况下它不会出错,并且有一些方法可以处理代理对,如提供的链接上的代码所示。
    • @cubuspl42 UTF-16 不限于 0x0-0xFFFF,它可以对 16 位字符对进行编码,并表示从 0x0-0x101000 的整个 Unicode 范围,超过一百万个代码点。这些对被称为“代理对”。
    【解决方案3】:

    它只是一个 16 位的值,没有在 ECMAScript 标准中指定编码。

    请参阅本文档中的第 7.8.4 节字符串文字:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

    【讨论】:

      猜你喜欢
      • 2019-06-16
      • 2011-06-03
      • 1970-01-01
      • 2016-05-31
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多