今天在朋友圈看到有人贴出来了很好玩的截图
这究竟是怎么做到的呢?让我们从字符集说起。
ASCII
用电脑显示文字其实是一件很复杂的事情,最简单的比如英文这种拼音文字一共26个字母,大小写加在一起一共是52个,而最小用5*7的点阵就可以显示出来
我们学习C++的时候经常会用到这个叫做ASCII码的东西,ASCII是基于拉丁字母的一套电脑编码控制系统。一共定义了128个字符,用8个二进制位来表示。除了52个字母以外,还有数字,符号,空格和31个不可见符号。
应该很多人还记得32是空格,65是A,97是a,在VB里面会用ASCII码来判断按键。32以前的编码是不可见字符,可以控制换行,文件分割,退格等操作。
在有些终端会把32以前的编码解析为笑脸或者扑克牌符号一类的字符。
详情见 维基百科 ASCII
所以我们很容易想到一个问题:ASCII码表示英文绰绰有余,但是中文那么多字,8个二进制位肯定不够用的,除了中文英文以外,还有很多奇奇怪怪的各国文字,ASCII显然更加不够用了,那怎么办呢?
UNICODE
Unicode是国际通用的文字编码,目前的版本已经收录超过十万个字符。
Unicode第一个版本1.0.0是1991年发布的,包含了阿拉伯字母,希腊字母,拉丁字母,平假名,片假名,藏文等。中文在次年的1.0.1版本被加入。
unicode常用表示法是四位16进制数,每个字符2字节,理论上最多表示65535个字符,已经可以支持日常的使用了。
前面说到收录超过十万个字符,这是Unicode字符平面映射的机制决定的,详情可以参见维基百科 Unicode字符平面映射
这个表的最前面128个字符和ascll是一致的,便于两个字符集转换,后面就开始各种颜文字了。先是一波带调号的字母,然后是各种钩子,叉子(ʐ ʑ ʒ ʓ ʔ ʕ ʖᴤ ᴥ ᴦ ᴧ ᴨ ᴩ ᴪ ᴫ)还有希腊字母(ΑαΒβΓγΔδΕε...)
另外还有一些神奇的东西,比如盲文
给你们一个网站,可以自己找好玩的外国文字(为了看清文字,后面几段做了加粗)
比如这个像来了姨妈似的表情௳是一个泰米尔文,还有一个疼的不行的升级版௸。这个大针蜂మ是泰卢固文字母,还有个喝了三鹿的大针蜂య
僧伽罗语很多人都听说过,它的字母也很萌,比如一只大眼睛ෛ,缅甸语里面还有猴子ဦ
来自埃塞尔比亚的小风车ሸ,还有膝盖中箭的小风车ሹ,脚踝中箭的小风车ሺ,浑身中箭的小风车ጁ
来自加拿大的印第安方言嘲讽二兄弟ᐖ和ᐛ
表情包就找到这里,反正网址也贴出来了,你们可以自己找着玩,接下来我们来说一开始的问题。
特殊符号
当一直往下翻unicode列表的时候,会发现几个空白的格子。
之前ASCII的时候也说到,有些符号是不可见的,代表一些特定功能,其中202e的说明我们打开看一下:
这个字符是给一些从右向左的语言使用,使文字按照从右向左的顺序排列,还有一个字符\u202d是强制从左向右,我们现在分析一下为什么利用这两个字符可以做到撤回的神奇效果。
首先我的名字:
王德福 == \u738b\u5fb7\u798f
而要加尾巴的文字是:
并亲了你一口 == \u5e76\u4eb2\u4e86\u4f60\u4e00\u53e3
然后我们在这一段前面加入\u202e来反向文字:
\u202e\u5e76\u4eb2\u4e86\u4f60\u4e00\u53e3 == 并亲了你一口
这时候需要调整一下文字顺序,变成:
\u202e\u53e3\u4e00\u4f60\u4e86\u4eb2\u5e76 == 口一你了亲并
我们的目的是把名字后半段插入到“撤回了一条消息”之后,所以要在“并亲了你一口”后加一个从左到右的符号\u202d,改造完成的后缀是:
\u202e\u53e3\u4e00\u4f60\u4e86\u4eb2\u5e76\u202d == 口一你了亲并
正常的时候会显示:
王德福撤回了一条消息 == \u738b\u5fb7\u798f\u64a4\u56de\u4e86\u4e00\u6761\u6d88\u606f
加上后缀之后就是:
\u738b\u5fb7\u798f\u202e\u53e3\u4e00\u4f60\u4e86\u4eb2\u5e76\u202d\u64a4\u56de\u4e86\u4e00\u6761\u6d88\u606f == 王德福口一你了亲并撤回了一条消息
图解一下发生了什么事情:
系统会先显示王德福,然后“口一你了亲并”会从右向左依次显示,而“撤”就直接接在“福”后面了,有一点类似前端所用的“float:right”的感觉。用这种方式达到了通过改名插入一个后缀。
p.s. 截至发文的时候,貌似微信已经修复了这个不算是BUG的小彩蛋。想借机泡妹子的弟兄们你们可能要失望了,不过或许你可以把这篇文章讲给妹子,让她觉得“哇塞,你懂的好多呀!”