繁体   English   中英

Node.js 对 Unicode 的支持如何?

[英]How well is Node.js' support for Unicode?

根据其语言规范,JavaScript 在 Unicode 方面存在一些问题(如果我理解正确的话),因为文本始终在内部作为一个由 16 位组成的字符处理。

JavaScript: The Good Parts以类似的方式表达出来。

当您在 Google 上搜索 V8 对 UTF-8 的支持时,您会得到相互矛盾的陈述。

那么:Node.js 中 Unicode 支持的状态是什么(当被问到这个问题时,当前版本是 0.10.26)? 它是否正确处理 UTF-8 将所有可能的代码点,或者不是吗?

如果不是:有哪些可能的解决方法?

您引用的两个来源,语言规范和 Crockford 的“JavaScript: The Good Parts”(第 103 页)说的是同一件事,尽管后者说得更简洁(如果你已经知道这个主题,那么清楚)。 作为参考,我将引用 Crockford:

JavaScript 是在 Unicode 预计最多有 65,536 个字符的时候设计的。 此后,它的容量已超过 100 万个字符。

JavaScript 的字符是 16 位的。 这足以覆盖最初的 65,536(现在称为基本多语言平面)。 剩下的一百万个字符中的每一个都可以表示为一对字符。 Unicode 认为该对是单个字符。 JavaScript 认为这对是两个不同的字符。

语言规范将 16 位单元称为“字符”和“代码单元”。 另一方面,“Unicode 字符”或“代码点”可能(在极少数情况下)需要两个 16 位“代码单元”来表示。

JavaScript 的所有字符串属性和方法,如lengthsubstr()等,都可以使用 16 位“字符”(使用 16 位/32 位 Unicode 字符,即 UTF-16 会非常低效)人物)。 例如,这意味着,如果您不小心,使用substr()您可以单独留下 32 位 UTF-16 Unicode 字符的一半。 只要您不显示,JavaScript 就不会抱怨,如果您显示它,甚至可能不会抱怨。 这是因为,正如规范所说,JavaScript不会检查字符是否为有效的 UTF-16,它只是假设它们是有效的。

在你的问题中你问

[Node.js] 是否会正确处理所有可能的代码点,或者不是吗?

由于所有可能的 UTF-8 代码点在其他任何事情发生之前都在输入中转换为 UTF-16(作为一个或两个 16 位“字符”),在输出中反之亦然,答案取决于您所说的“正确”,但如果你接受 JavaScript 对此“正确”的解释,答案是“是”。

如需进一步阅读和头疼: https ://mathiasbynens.be/notes/javascript-unicode

JavaScript 字符串类型是 UTF-16,因此它的 Unicode 支持是 100%。 所有UTF形式都支持所有 Unicode 代码点。

以下是常见形式的一般分类:

  • UTF-8 - 8 位代码单元; 可变宽度(代码点为 1-4 个代码单元)
  • UTF-16 - 16 位代码单元; 可变宽度(代码点为 1-2 个代码单元); 大端或小端
  • UTF-32 - 32 位代码单元; 固定宽度; 大端或小端

当人们认为每个代码点都适合 16 位时,UTF-16 得到了普及。 此情况并非如此。 UTF-16 后来经过重新设计,允许代码点采用两个代码单元,旧版本更名为 UCS-2。

然而,事实证明,可见宽度无论如何都不能很好地等同于内存存储单元,因此 UTF-16 和 UTF-32 的实用性有限。 自然语言很复杂,在许多情况下,代码点序列以令人惊讶的方式组合在一起。

“字符”的宽度测量取决于上下文。 记忆? 可见字素的数量? 以像素为单位渲染宽度?

UTF-16 仍然普遍使用,因为当今许多流行的语言/环境(Java/JavaScript/Windows NT)诞生于 90 年代。 它没有坏。 但是,通常首选 UTF-8。

如果您遇到数据丢失/损坏问题,通常是因为转码器存在缺陷或误用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM