想必大家经常会看到用来调戏QQ系统消息的昵称,在手机上会有【xxx撤回了一条消息,并亲了你一口】的神奇效果。本文只简单讨论背后unicode相关的原理,不涉及文本框的显示原理。
我的昵称显示为“gloria汪”,但撤回时会出现这样一条消息:
![](https://i-blog.csdnimg.cn/blog_migrate/92173a5f38fd5362cef2dfaa82ead61d.png)
什么情况?为啥我说话还带“汪”?把这一串神奇的昵称粘贴到unicode字符查询网站上在线查询,我们立马就能看出端倪:
![](https://i-blog.csdnimg.cn/blog_migrate/3c88841efdcb223450f484caf6b3b40e.png)
逮到了!图2中红框和蓝框标识的字符,显示为空字符,对应的Unicode编码值分别为U+202E、U+202D。这两个就是所谓的Unicode控制字符:它们是零宽度字符,简单来说看不见摸不着,但是可以对文本的显示方式进行控制(当然咯Unicode控制字符可不止这两个)。通过查询得知,上述两个字符的作用分别是:
真相大白。那靠它们是如何产生上面的效果的呢?为了便于理解,我们来举个栗子看看其中发生了什么;其中用“|”表示光标位置,用→表示书写方向以及下一个字符出现的位置:
我@gloria并发出了一条消息“【括号里是我的消息】”
文本框的显示过程是:
|→
@|→
@g|→
...
@gloria|→
这时好戏来了,文本框处理到了控制字符“U+202E”,告诉它,现在要从右往左书写
@gloria←|
下一个字符是“汪”,于是:
@gloria←|汪
然后又是一个控制字符“U+202D”,从左向右书写
@gloria|→汪
接下来的事情就很简单了,把我的消息贴在后面
@gloria【|→汪
@gloria【括|→汪
@gloria【括号|→汪
...
@gloria【括号里是我的消息】|→汪
结束~看看结果:
原理很简单,效果也很好玩。接下来大家可以思考几个问题:①如果把“汪”替换成“123”,显示出的文本是什么样的?②如果去掉最后一个从强制左向右控制字符“U+202D”会有什么效果呢?[答案链接]如果这两个问题懂了,恭喜,你可以玩转反向QQ昵称了,Enjoy it~
最后提供两个控制字符以供复制:
U+202E:从右向左强制
U+202D:从左向右强制