Reverse Text Generator — Mirror, Upside-Down & Zalgo
Paste anything to see it reversed, mirrored, rotated 180°, or zalgo-stacked — all four styles at once, copy in one click. Unicode-aware, emoji-safe, deterministic zalgo seed, runs entirely in your browser.
How it works
Each of the four styles is a pure function over the input string — no server call, no model, no dependency beyond the browser's built-in Unicode tables. The transformations compose two ideas: per-character substitution from a hand-curated map, and grapheme-cluster reversal via the JavaScript Intl.Segmenter API.
- Reversed. The input is segmented into grapheme clusters per Unicode TR-31. A grapheme is what a reader perceives as a single character: é may be one codepoint (U+00E9) or two (U+0065 then U+0301 combining acute), and a ZWJ-joined family emoji is several codepoints, but each is one grapheme. The cluster list is reversed and re-joined, so visual characters keep their integrity.
- Mirrored. Each grapheme is looked up in a mirror table that maps lowercase and uppercase Latin letters, digits, and bracket / quote pairs to their closest horizontal-mirror Unicode glyph (b↔d, p↔q, E→Ǝ, R→Я, (→), [→]). Symmetric letters (A, H, I, M, O, T, U, V, W, X, Y and l, o, x) map to themselves. The mapped string is then grapheme-reversed so the whole line reads right-to-left, as if held up to a mirror.
- Upside-down. A second lookup table covers the de-facto-standard 180° rotation glyphs sourced from the Unicode IPA Extensions block (U+0250–U+02AF) and Latin Extended-A/B: a→ɐ, b→q, c→ɔ, d→p, e→ǝ, m→ɯ, n→u, r→ɹ, t→ʇ, A→∀, E→Ǝ, F→Ⅎ, G→⅁, R→ᴚ, T→⊥, U→∩, V→Λ, Y→⅄. After mapping, the string is grapheme-reversed so a line of text rotates as a whole — the way it looks when the page is flipped on its horizontal axis.
- Zalgo.The output of zalgo is the input with stacks of Unicode combining marks inserted after each non-whitespace grapheme. The marks come from three pools — "above" (U+0300–U+033E plus U+035B–U+036F), "middle" (U+0334–U+0338, plus a handful from U+0488), and "below" (U+0316–U+0333) — and are picked by a deterministic mulberry32 PRNG seeded by the integer you choose. Same input + same intensity + same seed gives byte-identical output, which is why the Re-roll button changes the seed rather than re-running the same generator with new randomness.
The single cross-check that backs the "Verified" badge in the calculator header is the invariant reverse(reverse(x)) === x — reversing twice must return the original input. Because the reverse runs over Intl.Segmenter clusters, this invariant holds for emoji, combining marks, RTL scripts, and CJK characters too. If the badge ever turns red, please email — that is a regression we need to know about.
Worked examples
Frequently asked questions
Sources & references
- Unicode — Combining Diacritical Marks (U+0300..U+036F) chart
- Unicode — Combining Diacritical Marks Supplement (U+1DC0..U+1DFF)
- Unicode — IPA Extensions (U+0250..U+02AF) — source for rotated Latin glyphs
- Unicode TR-31 — Default grapheme-cluster boundaries
- MDN Web Docs — Intl.Segmenter API
- Unicode — Unified Canadian Aboriginal Syllabics (source for mirror glyphs)
The transforms on this page were last cross-checked on 2026-05-11. The page is reviewed whenever a Unicode revision adds new rotation or mirror glyphs to the Latin block, or when a combining-mark pool gets extended. Spotted a letter that renders poorly on a specific platform? Email me below.
Related tools
Comments & feedback
Spotted a bug or want an improvement? Tell us — our team reviews every comment, and good ideas get built. Comments are public and anonymous.
Spotted a letter that renders poorly, or want a new style added?
Email me at [email protected] — most fixes ship within 24 hours.