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

Gol*_*den 11 javascript unicode v8 node.js

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

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

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

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

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

Wal*_*oss 9

你引用的两个来源,语言规范和Crockford的"JavaScript:The Good Parts"(第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对此"正确"的解释,则答案为"是".