前言
这个问题来自开发一个系统测试提出的bug,某个字段限制只能传输50个字符,测试输入emoji表情,只输入了26个时保存就会报超长。
分析
Spring开发的程序,用@Length做的限制,总不会是框架的bug?
于是调试测试了一下,只传一个表情字符进来,代码接收到的字符串长度,竟然是2.
调试用的是飞机的表情字符✈️,后端在ide里调试时,现实的两个字符,第一个时飞机没错,第二个是一个不能显示的字符,十六进制'FE0F',这是什么?
Variation Selector-16
搜索了一下,发现emoji除了定义了表情字符,还定义了一个控制前一个表情字符如何展示的特殊字符叫'Variation Selector-16',具体介绍链接在这里。
简单来说,emoji字符串的展示方式,有字符方式和emoji方式两种,我的理解是emoji展示的效果更好。而有的字符,在emoji定义中,默认是用字符方式展示。
比如上面的飞机字符,unicode编码'U+2708',默认是'✈',而如果在这个字符后面紧跟着'U+FE0F'这个控制字符,则展示效果会变成✈️(具体展示效果取决于不同的浏览器)。
结论
部分emoji字符,通过输入法打出来的虽然是一个表情符号,但是由于后面跟了'Variation Selector-16',会占用两个字符。