根据它的language specification JavaScript有一些Unicode问题(如果我理解正确的话),因为文本总是被处理为内部由16位组成的一个字符。
JavaScript:好的部分以类似的方式说出来。
当您在Google上搜索V8对UTF-8的支持时,您会得到相互矛盾的陈述。
那么:Node.js中的Unicode支持状态是什么(当问到这个问题时,当前版本是0.10.26)?是否正确处理UTF-8所有可能的代码点,或者不是吗?
如果没有:有哪些可行的解决方法?
答案 0 :(得分:9)
你引用的两个来源,language specification和Crockford的“JavaScript:好的部分”(第103页)说同样的话,虽然后者说得更简洁(显然,如果你已经知道了学科)。作为参考,我会引用Crockford:
JavaScript是在Unicode预计最多有65,536个字符的时候设计的。它已经发展到容量超过100万字符。
JavaScript的字符是16位。这足以覆盖原始的65,536(现在称为基本多语言平面)。剩余的百万个字符中的每一个都可以表示为一对字符。 Unicode认为该对是单个字符。 JavaScript认为这对是两个截然不同的字符。
语言规范将16位单元称为“字符”和“代码单元”。另一方面,“Unicode字符”或“代码点”可以(在极少数情况下)需要表示两个16位“代码单元”。
所有JavaScript的字符串属性和方法(如length
,substr()
等)都使用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代码点。
以下是常见表格的一般细分:
当认为每个代码点适合16位时,UTF-16已经普及。此情况并非如此。 UTF-16后来经过重新设计,允许代码点占用两个代码单元,旧版本重命名为UCS-2。
然而,事实证明,可见宽度无论如何都不能很好地与内存存储单元相提并论,因此UTF-16和UTF-32都具有有限的实用性。自然语言很复杂,在很多情况下,代码点序列以惊人的方式结合在一起。
"字符宽度的测量"取决于背景。记忆?可见字素的数量?以像素为单位渲染宽度?
UTF-16仍然普遍使用,因为当今许多流行的语言/环境(Java / JavaScript / Windows NT)诞生于90年代。它没有破碎。但是,通常首选UTF-8。
如果您遇到数据丢失/损坏问题,通常是因为代码转换器存在缺陷或误操作。