使用方法
- 打开页面时输入框里已经放好示例「Upside Down Text 2026! 中文翻转」,共 27 个码点;结果框直接给出「转翻文中 ¡9ᄅ0ᄅ ʇxǝT uʍoD ǝpısdU」,上方五张卡显示可映射 16 个、不可映射 11 个、可映射率 59.26%。
- 输入上限是 2000 个码点。超过不会静默截断,会在提示区报出当前码点数并请你分段翻转。
- 在输入框里按 Ctrl + Enter(macOS 用 Cmd + Enter)触发,Enter 本身留给换行。
- 四个按钮分别是「开始翻转」「载入示例」「复制结果」「清空」。复制结果走剪贴板 API,权限被拒时会给出具体提示。
- 下方是 65 条字符映射对照表:默认只显示 12 行,点「加载更多」展开全部;「导出 CSV」下载带 BOM 的表格,Excel 打开中文与 IPA 字符都不乱码;「复制对照表」把整张表以 TSV 写入剪贴板。
上下颠倒文本生成器能解决什么问题
一是把普通句子变成视觉上倒过来的装饰文字。它输出的是货真价实的 Unicode 字符,不是贴图,因此可以直接粘进昵称、标题、签名、评论这些只吃纯文本的地方,任何能显示 Unicode 的终端都能渲染。
二是如实告诉你哪些字符根本翻不动。汉字、除 5 个以外的所有大写字母、以及绝大多数 emoji 都没有 180 度旋转字形,本页把它们统计成「不可映射字符」并给出可映射率,而不是假装整段都倒置成功了。示例里 27 个码点有 11 个不可映射,这个数字本身就是结论。
三是把可逆性讲清楚。数字里只有 6 与 9 互为旋转,6 翻过去是 9、9 翻回来是 6;而 1 翻过去是 Ɩ,Ɩ 再翻回来得到的是字母 I,所以 1 是单向的。凡是涉及往返还原的场合,都要先看这张表。
四是和「倒序」彻底分开。本页做的是 180 度旋转(既换字形、又反顺序),如果只想要「把字符顺序倒过来、字形不动」,那是文本倒序工具的活;如果只想要字形风格替换而不反序,见下方的字体类工具。
本页不做这些事:不把文字转成花体、手写体或粗斜体,那些属于手写体文本生成器与粗体文本生成器;也不做大小写转换,那由字母转大写负责。上下颠倒文本生成器只负责「旋转字形 + 反序」这一件事。
原理与规则说明
核心只有一行:翻转函数是 Array.from(s).map(c => MAP[c] || c).reverse().join('')。它按 Unicode 码点逐个取字符,先在 65 条映射表 MAP 里查对应的旋转字形,查不到就原样保留,最后把整个字符数组反转再拼回字符串。之所以用 Array.from 而不是 split(''),下面单独讲。
映射表为什么是这 65 条。旋转字形不是自由发挥的艺术字,而是 Unicode 里本来就存在的字符:字母取自 IPA Extensions(U+0250–U+02AF,如 ɐ U+0250、ɔ U+0254、ɟ U+025F、ɥ U+0265、ɯ U+026F、ɹ U+0279、ʇ U+0287、ʌ U+028C、ʍ U+028D、ʎ U+028E、ʞ U+029E、ɾ U+027E)与 Latin Extended-B(U+0180–U+024F,ǝ U+01DD、ƃ U+0183);数字用 IPA Extensions 与 Hangul Compatibility Jamo(ᄅ U+1105、ㄣ U+3123、ㄥ U+3125)里的形状;标点用 Letterlike Symbols 与阿拉伯/希腊区段的镜像形。整表 26 个字母 + 10 个数字 + 29 个标点,共 65 条。
为什么必须「映射 + 反序」两步。只做映射不反序,得到的是一串旋转过的字母但顺序还是从左到右,看上去并不倒;只反序不映射,那就是倒序工具的产物,字形完全没变。两步合起来才是「上下颠倒」。这两步的先后其实可以交换:因为映射是逐字符的,先映射后反序与先反序后映射结果完全相同,本页按先映射后反序写,只是为了读起来更直观。
真正的坑在「按什么切分字符」。JavaScript 字符串是 UTF-16,一个 emoji 常由一对代理项(surrogate pair)组成。用 split('') 会把它劈成两个孤立代理项,输出里就出现方块;用 Array.from(或 [...s])按码点迭代则不会。实测「Hi😀」用 Array.from 得到 3 个元素,用 split('') 得到 4 个——多出来的那一个就是被劈断的代理项。这是本页唯一一处必须用码点迭代的代码,也是「上下颠倒文本生成器」和随手写两行的区别。
边界数字要写清楚。CJK 统一表意文字 U+4E00–U+9FFF 共 20992 个码位里,没有任何一个被定义为 180 度旋转字形,所以汉字只能被反序、不会被改变形状;A–Z 26 个大写字母里只有 5 个存在旋转形态(Ⅎ U+2132、ℭ U+212D、ℌ U+210C、ℨ U+2128、ℊ U+210A),覆盖率为 5 ÷ 26 = 19.23%,其余 21 个属于不可映射;数字里 0 与 8 旋转后字形不变,只有 6↔9 互为旋转对。
常见误用要纠正两处。第一,别把「上下颠倒」当成「倒序」——前者换字形,后者只换顺序,两者结果完全不同。第二,别以为中文也能真倒置:本页对汉字只会给出反序后的原字,这正是可映射率会明显下降的原因,也是页面上要显示「不可映射字符数」的理由。
完整示例(数值仅作演示)
与页面默认值完全一致:输入「Upside Down Text 2026! 中文翻转」,共 27 个码点。实测:
- 可映射 16 个(11 个字母、4 个数字 2/0/2/6、1 个感叹号),不可映射 11 个(4 个空格、3 个大写字母 U/D/T、4 个汉字 中文翻转);
- 可映射率
16 ÷ 27 = 59.2593%,显示 59.26%; - 输出为 「转翻文中 ¡9ᄅ0ᄅ ʇxǝT uʍoD ǝpısdU」,输出码点仍是 27 个——翻转既不增删字符,也不会把两个字符并成一个。
把几组典型输入放进来对照,可以看到「翻转」到底改变了什么:
Hello World→plɹoW ollǝH:H、W 是大写,保留原样,其余字母换了旋转字形并反序;abc xyz 123→ƐᄅƖ zʎx ɔqɐ:数字 1→Ɩ、2→ᄅ、3→Ɛ,字母 b→q、c→ɔ、a→ɐ;The quick brown fox→xoɟ uʍoɹq ʞɔınb ǝɥT:整句顺序反转,每个词也各自变成旋转字形;你好世界→界世好你:4 个汉字全部不可映射,结果只是顺序被反转,字形一点没变。
再看一个 emoji 的例子:Hi😀 用码点迭代是 3 个字符,反向输出为 😀iH 再逐字符映射后得到「😀ıH」;如果错误地用 split(''),😀 会被拆成两个代理项,输出里就会出现两个方块。这就是本页坚持按码点处理的实际后果。
输入范围与对照表
输入长度上限 2000 个码点。2000 次 O(1) 查表加一次长度 2000 的数组反转,实测单次耗时约 0.07 毫秒,算力远不是瓶颈;设上限是为了不让超长文本把结果框撑爆、也让提示文案有明确的判断依据。超出时页面报错并给出当前码点数,而不做截断。
65 条映射按字符类别分成三块,变形与不变的条数如下:
| 类别 | 总条数 | 换了旋转字形 | 字形不变 | 典型 |
|---|---|---|---|---|
| 小写字母 | 26 | 21 | 5 | a→ɐ、e→ǝ、n↔u、b↔q、l/o/s/x/z 不变 |
| 数字 | 10 | 8 | 2 | 6↔9 互逆、1→Ɩ 单向、0 与 8 不变 |
| 标点 | 29 | 22 | 7 | ?→¿、!→¡、[↔]、= * + / \ @ # 不变 |
不同文本的可映射率差别很大,下面这张表可以帮你预判结果会「翻得多干净」:
| 示例文本 | 码点 | 可映射 | 不可映射 | 可映射率 |
|---|---|---|---|---|
| Hello World(纯英文含空格) | 11 | 8 | 3 | 72.73% |
| abc xyz 123(英文 + 数字) | 11 | 9 | 2 | 81.82% |
| Hello, World! (2026)(含标点) | 20 | 16 | 4 | 80.00% |
| 你好世界(纯汉字 4 字) | 4 | 0 | 4 | 0.00% |
| BTC 价格 65000 USDT(中英混排) | 17 | 5 | 12 | 29.41% |
| Hi😀🚀 emoji test(含代理对) | 15 | 10 | 5 | 66.67% |
边界与精度说明
- 输入上限 2000 个码点,超限报错不截断。截断后翻转的结果对应的是半段文本,却会显示得和整段一样确定,比直接报错更容易误导。要处理更长的文本请分段翻转。
- 汉字不在映射表里。CJK 基础区 20992 个码位无一具备 180 度旋转字形,所以中文输入只会被反序,字形保持不变。想让中文也「倒过来」,用力的方向不在这个工具上。
- 大写字母大部分翻不动。A–Z 里只有 Ⅎ ℭ ℌ ℨ ℊ 这 5 个有旋转形态,其余 21 个原样保留。一段全大写的文字翻转后基本「塌掉」,只剩顺序反转。
- 数字只有 6↔9 可逆。1→Ɩ 之后无法用本页映射表旋回数字;对需要往返还原的场景,这决定了哪些数字能安全翻转。
- 组合字符与 ZWJ 序列仍会被拆散。即使按码点迭代,e + 组合重音(如 é)是两个码点,家庭 emoji 的 ZWJ 序列是多个码点,反序后都会被打乱。要想完整处理这些序列需要字素簇分段(
Intl.Segmenter,granularity 取 grapheme),代价是本页内联脚本会超出 8 KB 预算,因此没有采用,转而在结果里显式统计不可映射字符。 - 映射表覆盖的是 ASCII 可打印字符的子集。65 条之外的任何码点(汉字、希腊文、emoji、全角符号等)一律原样保留,不会丢失,也不会报错。
- 全部计算在浏览器本地完成。文本不发送到任何服务器(可在开发者工具 Network 面板自查),刷新页面即清空,没有历史记录;复制功能依赖剪贴板 API,权限被拒时会给出具体提示而不是静默失败。
常见问题
为什么我输入中文,翻转后还是汉字?
因为汉字没有 180 度旋转字形。CJK 统一表意文字 U+4E00–U+9FFF 的 20992 个码位里,没有任何一个被 Unicode 定义为旋转形态,所以本页只能把汉字原样保留、连同整串一起反序。结果是「界世好你」这种顺序倒过来的原字,而不是「倒着的汉」。这类输入的可映射率通常会掉到 30% 以下,页面会用「不可映射字符数」把这个事实显示出来。
为什么大写字母基本没变?
A–Z 26 个大写字母里只有 5 个有对应的旋转字形:Ⅎ(U+2132)、ℭ(U+212D)、ℌ(U+210C)、ℨ(U+2128)、ℊ(U+210A),覆盖率仅 5 ÷ 26 = 19.23%。其余 21 个大写字母在 Unicode 里根本没有旋转形态,只能原样保留。所以一段「HELLO WORLD」翻转后字形几乎不变,能看到的只有顺序被反转。想要更明显的翻转效果,输入时把小写字母作为主体。
上下颠倒和「倒序」是同一个东西吗?
不是。倒序只把字符顺序反转、字形完全不动,那是文本倒序工具;上下颠倒既要替换成旋转字形,又要反转顺序,两步缺一不可。同一段文字在两个工具里结果不同,正是因为一个只管顺序、一个连字形一起换。判断你要哪一个的最快办法是:如果希望输出里出现 ɐ ɔ ǝ 这类字形,就用本页;如果希望字符集完全不变,就用倒序工具。
为什么 1 翻过去是 Ɩ,翻回来却不是 1?
因为数字 1 的旋转字形是 Ɩ(U+0196),而 Ɩ 再旋转一次得到的字形是字母 I,并不在数字映射表里,所以 1 是单向的、无法在数字内部往返。数字里唯一互为旋转对的是 6 与 9:6→9→6、9→6→9 都成立;0 与 8 旋转后字形本身就是自己。凡是需要「翻过去再翻回来」的场景,只对 6、9、0、8 安全。
为什么 emoji 会变成方块?
如果按 UTF-16 码元切分,一个 emoji 常由一对代理项组成,被 split('') 劈开后就剩两个孤立代理项,浏览器渲染成方块或问号。本页用 Array.from 按码点迭代,所以不会出现这个问题——但注意,即使按码点,ZWJ 序列(如由多个码点拼成的家庭 emoji)仍会在反序时被打散,因为码点不是最小的「用户感知字符」单位。
翻转后的结果能粘到哪里?
几乎所有接受纯文本的地方:社交平台昵称与简介、帖子正文、聊天消息、文档标题、文件名。因为输出是普通 Unicode 字符而非图片或富文本,不依赖字体之外的任何技术。唯一要留意的是对方系统对特殊字符的过滤策略,个别平台会限制显示非 ASCII 字符,这时结果可能被截断或替换成方框,与工具本身无关。
2000 个码点的上限是怎么定的?
这是一个「够用且不失控」的值。翻转 2000 个码点实测约 0.07 毫秒,算力远不是限制;真正的原因是超长文本会让结果框滚动变得难以阅读,也让复制、粘贴的体验变差。超过 2000 时页面直接报错并给出当前码点数,而不是悄悄截断——截断会让用户以为得到的是完整结果,反而更糟。
这种旋转文字能用来做 SEO 吗?
不能。翻转后的字符虽然看起来像原词,但码点已经完全不同,搜索引擎看到的是 ɐ ɔ ǝ 这些独立字符,而不是你想要的英文单词,它既不会被当作关键词收录,还可能被视为乱码。正确做法是把旋转文字留给纯装饰场景(昵称、标题美化),正文关键词仍用正常字符书写。