在文本反转工具里输入 "Hello World! How are you today?",按模式不同得到三个不同的答案:按字符反转把这条 31 个字符的句行变成 "?yadot uoy era woH !dlroW olleH",按词反转保留全部 6 个词只调换顺序,得到 "today? you are How World! Hello",按行反转只调换行的顺序,每一行内容原样不动。三种结果都在浏览器里算完,没有任何请求发往服务器。
按字符反转走的是码点,不是字节
按字符模式从最后一个码点读到第一个再写回,所以每个词内部的字母也会动。"Hello World! How are you today?" 回来是 "?yadot uoy era woH !dlroW olleH",问号排到最前,Hello 的大写 H 排到最后。切分发生在码点层面而不是字节层面,表情符就是一个单位:"ab🚀cd" 返回 "dc🚀ba",火箭完整地夹在两对字母中间。字符计数器与分析器对同一输入报 6 个字符,因为它的计数跟随内部 16 位单元,火箭占两个,而可见符号是 5 个。
按词反转重排词序,顺带归一化空白
按词模式是保留词的那一个。它按空白串切输入,丢掉空片段,把词表倒序再用单个空格重连,所以 6 个词的句行返回 "today? you are How World! Hello"。重连也顺手清掉空格:"hello" 后跟三个空格再跟 "world",回来是 "world hello",一个空格,首尾不留余量。如果一段文本的空格很不规则,空白字符清理对整个文档一次应用同样的收缩到单空格规则,而这里的按词模式只在重排时归一化。
按行反转只换行的顺序
按行模式保留每一行的内容,只改它们的顺序:三行 "apple"、"banana"、"cherry" 的块回来是 "cherry"、"banana"、"apple",日志行块变成最新在前,内部一个字符都不碰。比较用法正是字符串相似度的位置:把原始块和按行倒序的孪生块喂进去,它给出两次阅读有多接近的分数,这就是回文检查的数值形式,和反转一行再问答案是否等于问法,是同一招。
反转两次回到原文
按字符模式是自己的撤销。把 "?yadot uoy era woH !dlroW olleH" 再跑一遍,拿回 "Hello World! How are you today?",31 个字符原顺序一个不差,因为一个列表反转两次就是恒等。按词模式也能往返,但只到第一次已经做过的归一化:出时把三个空格压成一个,回来时就是一个。这种成对性质,变换再逆变换,正是编码器用起来感觉相同的原因:URL 编解码器也是成对工作,先编码再解码,解码输出必须等于输入,否则这对就断了。
反转在文本管线里的位置
反转是能搭出的最便宜的编码,一次纯排列,不花一个比特,和真正花比特的编码器插在同样的管线里。文本转二进制的指南讲的是相邻的方向,把每个字符映到 8 位编码,"Hi" 读作 01001000 01101001,同样的往返逻辑适用:把编码解回去,必须落回产生它的那串字符。反转是这个家族里零成本的成员,逆操作就是操作本身,这正是写脚本的人测试管线是否保内容时第一个想到它的理由。
从反转到分析
反转的目的很少是反转后的文本本身,而是比较揭示的东西。回文、顺序检查、倒着读一段以发现眼睛跳过的东西,都是比较工作,词数与字符统计指南是这次比较另一侧数字的出处:按原样写下的块的词数、字符拆分和前 10 个高频字符。重排不改变其中任何一个,词频统计工具把它看得很清楚:反转句和原句都清洗成同样 6 个词,hello、world、how、are、you、today,各出现一次,因为重排不改变任何词、不改变任何计数。