“撤回了一条消息并”的原理

2017-03-17 20:48 #旧文章

提示

本篇文章假设你的阅读顺序是从左到右的。并假设你知道 JavaScript 中转义字符相关的知识。

本文中出现的术语

  • RTL 即 Right To Left 右到左
  • LTR 即 Left To Right 左到右

如果你不想看我的探索历程,那你可以直接跳到最下方。

蜜汁消息
蜜汁消息

挺久以前我在 QQ 上就见过这一种蜜汁消息了,但是那时候我还不清楚这是什么原理。就在昨天晚上,我在 B 站上面看到了一个可以将文字倒过来显示的字符,作为一个搞程序的,我当然不会看过就过了,于是我把这一字符粘贴到了 Unicode 上,得到了如下结果:

编码:0x202E
描述:RIGHT-TO-LEFT OVERRIDE

原来如此,于是我又翻了一下其他邻近的字符,我又发现了下面三个字符:

编码:0x202D
描述:LEFT-TO-RIGHT OVERRIDE

编码:0x200F
描述:RIGHT-TO-LEFT MARK

编码:0x200E
描述:LEFT-TO-RIGHT MARK

嗯,就差不多这四个字符有意思,我下面分别说说这四个字符的用处。

0x202E

首先是 RIGHT-TO-LEFT OVERRIDE,如果你在一个普通 LTR 字符串中间加入这个字符,那么在这一个字符后面的所有字符都会被反向显示,也就是说从这个字符开始的显示方向被改成 RTL。

控制台内容
控制台内容

上图是我在 Chrome Dev Tools 的控制台中的截图,第一行是我的输入,\u202E 是该字符的转义,然后在第二行的输出中,后面的字符被倒过来显示了。

控制台内容
控制台内容

0x202D

0x202D 则与 0x202E 相反,这个字符会把原来是 RTL 的显示顺序重写为 LTR。

所以我们可以这样做:

控制台内容
控制台内容

0x200F

0x200F 可以使字符串右对齐,并且似乎出现在行首时才会有效。

这个字符在安卓的输入框中可以使输入的文本向右对齐,大家可以通过 Unicode 来复制这个字符到剪贴板。

因为这一个字符在 Chrome Dev Tools 里面看不到效果,我就不贴图片了。

0x200E

0x200E0x200F 的作用相反,如果字符串已经被居右了,那么可以通过这一个字符串改回居左。

好戏上演

通过上文,预备知识已经完整了,制作蜜汁撤回消息只需要前两个字符。

控制台内容
控制台内容

还记得这张图片吗?用来表示字符串的黑色引号被 RTL 的 123456 顶到了中间。

我们这么试试:

控制台内容
控制台内容

变量 nick 是我们在 QQ 群中的名片,而变量 c 则是 QQ 要在名片后面加入的东西,然后我们将这两个字符串连接并输出,可惜是乱的。

稍微改动一下,把 nick 后半部分反过来写:

控制台内容
控制台内容

好!后半部分显示正常了,可是现在中间部分还不尽如人意,我们再加一些东西:

控制台内容
控制台内容

大功告成!我们现在可以把群名片改了然后去撤回一条消息来装逼了!有了上面的预备知识,大家还可以在其他许多地方搞事情,祝大家玩得愉快!我要去学习了。

距离高考还剩 81 天。