🔄 Text Reverser & Flip Tool
Reverse text, flip word order, invert line sequence, or generate upside-down unicode text. Instant browser tool with 1-click clipboard copy.
Reversed Output
What Text Reverser & Flip Tool Does
This tool reverses text four ways: character order, word order, line order, and upside-down text, which reverses the characters and swaps each one for its rotated Unicode counterpart. Everything runs in the browser as you type, and the result is one click from the clipboard.
The part that separates a correct reverser from a broken one is what it treats as "a character". JavaScript strings are stored as UTF-16 code units, so the obvious implementation — split the string, reverse the array, join it — tears anything built from more than one unit. This tool segments the text into grapheme clusters instead, using Intl.Segmenter: a cluster is what a reader perceives as a single character, whether it is stored as one code unit or eleven.
That distinction is not academic, and it is not the same as the code-point fix most tools reach for. Measured on the string "Hi 👨👩👧!": it is 12 UTF-16 code units, 9 code points, and 5 grapheme clusters. Reversing by code unit produces unpaired surrogates and visible mojibake. Reversing by code point keeps the characters legal but rebuilds the family emoji in the opposite order, producing a different sequence from the one you typed. Only grapheme segmentation returns the family intact.
How to Use Text Reverser & Flip Tool
- Choose a mode: Reverse Characters, Reverse Words, Reverse Lines, or Upside Down
- Type or paste your text
- Click Copy Output to paste anywhere on social media or in documents
Formula Used by Text Reverser & Flip Tool
The three things "a character" can mean
code units ≥ code points ≥ grapheme clusters
- code unit
- A 16-bit slot in a JavaScript string. What String.length counts and what split("") splits on
- code point
- One Unicode scalar value. What Array.from() and the spread operator iterate
- grapheme cluster
- What a reader sees as one character, including a base plus its combining marks and any ZWJ-joined sequence. What Intl.Segmenter returns and what this tool reverses
Worked example
The string "Hi 👨👩👧!" — the word Hi, a space, a family emoji, an exclamation mark.
- Counted as code units: 12 — split("") cuts each emoji in half
- Counted as code points: 9 — the family is 3 people plus 2 zero-width joiners
- Counted as grapheme clusters: 5 — H, i, space, family, !
- Reversed by code point: "!👧👩👨 iH" — still valid, but the family is now girl-woman-man
- Reversed by grapheme cluster: "!👨👩👧 iH" — the family is unchanged, as it should be
Result: Three different answers from the same input. Only the last one returns the emoji you typed, which is why this tool segments rather than splits.
What Each Reversal Strategy Does to Real Input
Every row measured directly. "Code point" is the Array.from approach that the best-written alternative describes as handling all edge cases.
| Input | By code unit | By code point | By grapheme cluster (this tool) |
|---|---|---|---|
| Hi 👨👩👧! | Unpaired surrogates — mojibake | !👧👩👨 iH — family rebuilt in reverse | !👨👩👧 iH — family intact |
| 🇺🇸 USA | Broken flag | ASU 🇸🇺 — a different regional-indicator pair | ASU 🇺🇸 — flag intact |
| 👍🏽 (thumb, medium skin tone) | Mojibake | Modifier detaches and trails the thumb | Stays one character |
| e + combining acute (decomposed é) | Accent separates from its letter | Accent separates from its letter | é stays whole |
| café (precomposed é) | éfac | éfac | éfac — all three agree here |
The Four Modes
What each mode reverses and what it leaves alone.
| Mode | Reverses | Leaves alone | Example |
|---|---|---|---|
| Characters | Grapheme cluster order across the whole text | Nothing | Hello World → dlroW olleH |
| Words | Word order | The letters inside each word | Hello World → World Hello |
| Lines | Line order | Everything inside each line | Newest-last log → newest-first |
| Upside down | Character order, and rotates each mapped character | Any character absent from the map | Hello World → plɹoM ollǝH |
Upside-Down Map Coverage — 70 Characters
Counted from the map itself. Anything not listed passes through unrotated, keeping only its reversed position.
| Group | Count | Notes |
|---|---|---|
| Lowercase a–z | 26 | Complete. Note l maps to itself, not to a turned form |
| Uppercase A–Z | 26 | Complete |
| Digits 0–9 | 10 | 6 and 9 swap; 0 and 8 map to themselves |
| Punctuation | 8 | Period, comma, question mark, exclamation mark, apostrophe, double quote and the two parentheses — brackets and braces are absent |
| Characters that map to themselves | 14 | 0 8 l o s x z H I N O S X Z — already symmetric under rotation, or left unmapped by choice |
| Accented and non-Latin letters | 0 | é, ï, ñ, Cyrillic, Greek and CJK all pass through unrotated |
How to Read Your Result
Upside-down text is not mirrored text
Rotating a character 180 degrees and mirroring it across a vertical axis are different operations that happen to agree on a few letters. This tool rotates: it reverses the reading order and substitutes turned forms, which is what makes the result readable when you physically turn the screen over. A true mirror needs the reflected glyph shapes, which mostly do not exist as Unicode characters. People do go looking for a true mirror flip, and this tool does not do it.
Flipping twice does not give you back what you started with
The map is one-directional. "Hello" flips to "ollǝH", and flipping that result returns "Hǝllo" — not "Hello". The reason is that ǝ is a value in the map but not a key, so the second pass reverses its position without rotating it back. The same applies to every turned character. If you need the original text, keep it; do not rely on running the tool twice.
Right-to-left text will not behave the way you expect
Arabic and Hebrew are stored in logical order and reordered for display by the Unicode Bidirectional Algorithm. Reversing the stored characters therefore does not produce a neatly backwards line — the display algorithm runs again on the reversed string and the visual result is rarely what was intended. "Text reverser Arabic" is one of the related searches Google lists for this term, and the honest answer is that character reversal is the wrong tool for it. The reversal here is still correct at the grapheme level; it is the rendering that will surprise you.
Brackets do not rotate, and the inverted marks are one-way
Parentheses are in the map and swap correctly, so "(a)" flips cleanly. Square brackets and braces are not, so they keep their original shape while moving to the opposite end — "[bracket]" comes out with the closing bracket first. Question and exclamation marks map to ¿ and ¡, but ¿ and ¡ themselves are not keys, so Spanish text that already contains them flips into a line with two opening marks and none closing.
Limitations & Accuracy Notes
- Four modes only. There is no per-word letter reversal (reversing the letters inside each word while keeping word order), no mirror mode, and no palindrome check — at least one other tool offers all three.
- The upside-down map covers 70 characters: unaccented Latin letters, digits, and eight punctuation marks. Accented letters, Cyrillic, Greek, CJK, brackets and braces pass through unrotated, so mixed text comes out partly flipped.
- Lowercase l maps to itself rather than to a turned form, so it is the one letter that looks unflipped in otherwise correct output.
- The upside-down transform is not reversible. Running it on its own output does not restore the original text.
- Right-to-left scripts are reversed correctly at the character level, but the bidirectional display algorithm re-orders the result, so the rendering is generally not a readable backwards version of the input.
- Word mode splits on any run of whitespace and rejoins with a single space, so runs of multiple spaces, tabs and the alignment they created are not preserved. Line mode splits on the newline character only; a file using bare carriage returns is treated as one line.
- Grapheme segmentation depends on Intl.Segmenter, which every current browser supports. In an older browser without it, the tool falls back to code-point iteration and the emoji cases in the table above regress to the middle column.
Frequently Asked Questions
What text flipping modes are available?
How does upside-down text work?
What is the difference between reversing characters and reversing words?
Does it handle emoji and accented characters correctly?
Why would anyone need to reverse text?
Does reversed text work as a way to hide something?
Will it reverse right-to-left scripts correctly?
Is my text sent anywhere?
References & Further Reading
- Unicode Standard Annex #29 — Text Segmentation — Defines the grapheme cluster boundary rules this tool reverses on, including the ZWJ and combining-mark cases
- MDN — Intl.Segmenter — The browser API used for grapheme segmentation, and its support baseline
- Unicode Standard Annex #9 — Bidirectional Algorithm — Why reversing the stored order of Arabic or Hebrew text does not produce a reversed display