piapia123
zh

文本逆序翻转

文本

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

「把文本倒过来」这句话本身是有歧义的,而四种理解给出的结果完全不同:`abc` 变成 `cba`(行内翻转)、第一行变成最后一行(行序倒置)、整段连着换行一起翻(整段翻转)、`one two` 变成 `two one`(词序倒置)。所以这里给的是四个独立的选项,而不是一个「翻转」按钮 —— 猜错一次的代价是重新粘贴一遍。 按字形簇翻转,不是按码元。 `「👍🏽」.length` 是 4:一个带肤色修饰的 emoji 在 UTF-16 里占 4 个码元。按码元倒过来会把它拆成两个孤立的代理项,屏幕上直接是 `��`;按码点倒能修好代理对,但拆不掉 `👨‍👩‍👧` 这类 ZWJ 序列与带变音符号的拉丁字母。所以这里用浏览器原生的字形簇切分,取的是「你眼里的一个字」。 词序倒置不会动你的排版。 首尾空白与词之间的间隔都留在原位,只把词换位置 —— 否则 ` foo bar` 会变成 `bar foo `,缩进跑到行尾。

功能

  • 四种翻转各自独立:每行内部、整段、行序、词序
  • 按字形簇处理,emoji、肤色修饰、ZWJ 序列与组合变音符号都不会被拆成半个字符
  • 行内与词序模式保留行结构,行数不变
  • 词序倒置保留首尾空白与词间间隔,缩进不会跑到行尾
  • 行序倒置是纯行序操作,行内一个字都不动
  • CRLF / CR / LF 三种换行都认,输出统一成 LF
  • 空行照常参与(行序倒置会把它一起倒过来)
  • 全程在浏览器本地计算,内容不上传

使用方法

  1. 把要翻转的文本粘贴进输入框
  2. 选一个翻转单位,结果实时更新
  3. 点「复制」取走结果

常见问题

「整段翻转」和「行序倒置」有什么区别?
行序倒置只换行的位置,行内一个字都不动:`abc / def` 变成 `def / abc`。整段翻转是把整段文字当作一个序列倒过来,换行也在被翻转的序列里:`abc\ndef` 变成 `fed\ncba` —— 行数不变,但每一行的内容来自原来的另一行,行尾那个换行的有无也会翻过来。它就是「把纸转 180°」的字面意思,也是最容易让人意外的一个,所以单独列成一项。
为什么词序倒置之后缩进还在行首?
因为翻转的是词、不是字符。做法是把一行切成「词 / 间隔」交替的序列,间隔留在自己的位置上,只把词反转后填回去。所以 ` foo bar ` 得到 ` bar foo `(前导两空格与行尾空白都在)。连间隔一起反转的话缩进会跑到行尾 —— 那属于「顺手把我的排版也改了」,而这个工具不该做那件事。
emoji 会被拆坏吗?
不会。切分用的是浏览器的字形簇规则(`Intl.Segmenter` 的 grapheme 粒度),它按「用户眼里的一个字符」切,而不是按码元或码点。所以肤色修饰的 `👍🏽`、ZWJ 连接的家庭 emoji、以及 `é` 这种「基字母 + 组合符」的两码点写法都是一个整体,翻转后不会被拆成乱码。

相关工具