Node.js对Unicode的支持程度如何?

时间:2014-03-20 19:36:09

标签: javascript node.js unicode v8

根据它的language specification JavaScript有一些Unicode问题(如果我理解正确的话),因为文本总是被处理为内部由16位组成的一个字符。

JavaScript:好的部分以类似的方式说出来。

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

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

如果没有:有哪些可行的解决方法?

2 个答案:

答案 0 :(得分:9)

你引用的两个来源,language specification和Crockford的“JavaScript:好的部分”(第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就不会抱怨,如果您这样做,甚至可能不会抱怨。这是因为,正如规范所说,JavaScript 检查字符是否有效UTF-16,它只是假定它们是

在你的问题中,你问

  

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

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

答案 1 :(得分:0)

JavaScript字符串类型为UTF-16,因此其Unicode支持为100%。 所有UTF表单都支持所有Unicode代码点。

以下是常见表格的一般细分:

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

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

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

"字符宽度的测量"取决于背景。记忆?可见字素的数量?以像素为单位渲染宽度?

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

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