解答为什么'𣎴'.length输出2
发布于 5 年前 作者 libook 4138 次浏览 来自 分享

这实际上是空间复杂度和实用性的权衡策略,也可能是各家对Unicode的早期实现的坑,很多技术都中招了,不光是JavaScript,Java也有这样的问题,MySQL也为此出现了utf8和utf8mb4诡异的两种数据类型。

Unicode分基本多文种平面和辅助平面两部分,JavaScript使用UCS-2来表示Unicode字符的,也就是说基本多文种平面字符用1个JavaScript字符表示,辅助平面字符用2个JavaScript字符表示,所以在JavaScript中,‘𣎴’这个字符实际上是’\ud84c\udfb4’,输出length肯定就是2了。

可以参考这篇文章《JavaScript 的内部字符编码是 UCS-2 还是 UTF-16》

8 回复

可是为什么我在谷歌浏览器和node.js里面输出都是1的? Node.js版本是V8.11.2.

@zurmokeeper 你直接复制我题目上的代码吧,这个字符不是汉字’不’,而是一个特殊符号’𣎴’和汉字长得很像,但不一样。

@alsotang 发这个帖子的时候一开始打算发这个来着,介绍了各种Unicode的处理案例

'a' !== 'а'

@enmoon 因为’a’和’a’被赋值给window.x和window.y,也就是window的属性.,比较的是地址。两个‘a’(对应的堆内存是同一处)的地址(对应的占内存不同)分别是两处16进制的地址内存。

在编程中,特殊符号真的很讨厌,特别是像汉字的特殊符号!

回到顶部