1个emoji符号竟然不算1个字符?!
为了修复一个 bug,我在浏览器的控制台里敲下了几行 JavaScript 代码,运行结果非常出乎意料:
表面上,每个 emoji 看起来都是 1 个字符,只不过是彩色的。但结果显示,有的 emoji 确实就是 1 个字符,有的则算作 2 个,甚至还有的多达 5 个字符。
顺便提一下我要解决的 bug。如下图所示,预期点击“Decompress”按钮后,文字就会填充到左侧的表格中,每个格子一个字符,就像小时候写作文那样。但图中这段文字(有谁知道这是哪个 FC 游戏的画面吗?)明明是足球 emoji 后面只跟了 1 个空格,但填充到表格里后,却莫名其妙又多了 1 个空格。
但没有 emoji 的字符串不会产生多余的空格,所以我猜测可能是计算 emoji 字符的长度时出现了问题。
这背后的原因还挺复杂的,简而言之就是:
日历 emoji(📅,逗号前的 emoji 能看到吗?)是一个独立的符号,Unicode 编号是 U+1F4C5,所以 Array.from() 得到的长度是 1
足球 emoji(⚽️)则由 2 个码点组成:U+26BD 和 U+FE0F,后者称为变体选择符(Variation Selector-16),用来指示系统以彩色的 emoji 形式显示,如果没有它,就只是普通的黑白符号
家庭 emoji(🧑🧑🧒)则更复杂,由 5 个码点组成,包括 3 个家庭成员,爸爸、妈妈和我的 emoji 以及 2 个零宽连字符(ZWJ,Zero Width Joiner),ZWJ 用于将多个符号组合成一个整体图标,这样系统就能渲染成一个“家庭”图标。ZWJ 相当于 emoji 世界的“胶水”
这些例子表明,emoji 实际上是 Unicode 码点的组合,很难简单地定义它是否是 1 个“字符”。虽然我们看到的是一个图标或一个表情,但在编码层面,它可能是多个符号和控制字符的结合。也就是说,所谓的“1 个字符”在存储上并不总是指 1 个码点或 1 个数组元素。
眼见它起高楼,眼见高楼塌,Oracle裁撤MySQL团队,社区版危矣!
消失的数据库巨头,如今只剩3家活着!
给每种语言 1GB 内存,看看谁先死 !
《AI数据分析之ChatBI发展与应用实践》白皮书(附下载)正式上线啦
Linux 一键巡检脚本,建议收藏!
MySQL要坐不住了!Vitess之父Sugu“投敌”Postgres造新数据库,这次真要掀翻桌子?
为什么DeepSeek火之后,人们想到的是大量裁员,而不是实行上三休四?
苹果“痛下杀手”弃Java,用自家语言Swift重写关键服务:内存减90%,性能增40%!
号外!《核心系统分布式数据库选型指南》电子书(附下载)正式上线
解锁数据架构现代化密码,《实时数仓选型指南》电子书(附下载)正式上线啦