差友们,年少时有击穿过评论区的天花板么?
像这样 ↓ ↓
或者这样 ↓ ↓
这些玩意几年前还挺流行的,相信有不少差友也参与其中复制过。
那么,在大家复制玩耍的时候,有没有想过这到底是怎么实现的?
在继续介绍前,世超得带大家简单回忆一下 Unicode 编码。
Unic++ode( 统一码、万国码、单一码 )是计算机科学领域里的一项业界标准,包含字符集和编码方案。
大家都知道,计算机在内部运算和存储的其实都是 0 和 1 ,但是人不可能只看数字,人要看文字,于是大家就建立了一个由数字跟文字互换的对应标准~
比如英文字母 A 对应二进制 0110 0001 ,英文字母 B 对应 0110 0010 等等。
最开始各国都有各自的编码方案,毕竟都有自己特色文字嘛,但一阵子时间后发现,乱的一匹!
因为同一编码值在不同编码体系中代表不同的字,举个不恰当的例子,小 A 电脑上用的是 AsciI 编码,他发字母 A 给小 B ,而小 B 电脑上用的是 EBCDIC 编码,可能识别成了字母 S ,编码跟解码的方式不同,双方交换信息时就产生了误解。
咱们日常生活中遇到的乱码,也是编码跟解码方式不一致的结果~▼
为了避免麻烦,方便协作,大家就约定用统一且唯一的数字编码标准,这也就是 Unicode 。
Unicode 是一个大家庭,看它名字就知道了,万国码!可不得把所有语言中的字符都吸纳进来么,这就引发了很多有趣的事情。
文章开头提到的 “ 击穿 ” 屏幕的东西,就是 Unicode 组合字符,它们会附着在前一个非组合字符上。
为了让大家更具象的感受,接下来世超用 Chrome 的开发者工具来帮助演示。
打开浏览器按 f12 即可调出该工具▼
首先我们输入字母 A( \u0041 ) ,然后输入组合字符圆圈 ̊ ( \u030A ),接着将圆圈重复 100 个( repeat( 100 ) )。
我们输入:'\u0041'+'\u030A'.repeat(100)
接着,按下回车,就能看到效果了~
复制出来 biubiubiu~
组合字符之所以存在主要是为了满足一些语言、文字中的需要,比如中文有声调符号,法文有重音符号,泰文里有声调符号跟母音符号。
其实击穿天花板还不算什么。
不知道大家以前有没有遇到下面这种套路。
世超撤回了一条消息并亲了你的小脸 ▼
这个 Bug 一出来的时候,可谓是轰动一时,当时各大微信群里大家撤回的不亦乐乎,可惜很快就修复了。
还有那种,艾特他的微信 ID ,艾特出来是倒过来的,举个栗子对方 ID 是:abcdEF ,但是圈出来变成了:FEDcba 。
这大概率是 Unicode 控制字符在捣蛋~
什么是控制字符呢?
像我们用的回车、换行等,对文本进行控制的字符,就叫控制字符。
控制字符中有两个哥们,一个叫 RLO ( \U202E ,强制后续字符从右到左显示 ),一个叫LRO ( \U202D ,强制后续字符从左到右显示 )
来简单感受一下。
第二行翻译过来是 “ 我喜欢你 ” ,我们在开头加一个 RLO ( \U202E ),可以看到文字变成了 “ 你欢喜我 ” 。
控制字符的 “ 玩法 ” 非常多,以前甚至有人用这玩意来伪装木马。
举个栗子,你创建一个 exe 文件,命名为 cdtxt.exe,然后重命名,并在 cd 后面插入一个 RLO 控制字符( 从右到左显示 )。
这个时候 exe 文件名会倒过来显示成 exe.txt ,看上去就像是一个 txt 文件!~
就像下面这样▼
一般用户乍一看,哪能想到 txt 后缀的文件也能执行起来?结果一打开直接中招。。。
大概就是这么个玩意。
前面提到的,被微信修复的「 撤回消息并亲了你一下 」的效果也是利用这两个控制字符,通过两次调换方向,将一部分文字调换到了系统的 「 撤回了一条消息 」后面显示。
控制字符的存在的原因,想必各位差友已经猜到了,虽然大部分语言的书写习惯是从左到右写,但是有些语言是从右到左的,比如阿拉伯语。
最后世超再教大家一手好玩的吧:利用神秘代码跟朋友表明心声。
首先,找一个中文跟 Unicode 互换的网站,将想说的话转换为 Unicode 。
发给朋友,让 TA 长按翻译,再点击翻译进行重译。
TA 就能听到你的心声了~
哦,对了,不要发给不解风情的人。
否则可能会得到一个奇怪的结果 (╯ ̄Д ̄)╯╘═╛
我知道,肯定有不少高手要在评论区秀神秘点拨了。。。