Reverse and Upside-down Text, Explained

After reading this you will know exactly what "reverse" and "flip" do to a string, why the unit of reversal matters, and why upside-down text looks fine to your eyes but reads as noise to machines.

Reversing text sounds trivial: take the characters and put them in the opposite order. It is trivial for abc, which becomes cba. It stops being trivial the moment your text contains an emoji, an accented letter, or a family-of-four emoji built from five separate codepoints. The order you reverse in, and the unit you treat as "one character," decides whether the output is clean or shredded.

Upside-down text is a different trick entirely. Nothing is rotated by your computer. Instead each letter is swapped for a real Unicode character that happens to look like the original turned 180 degrees. The word text becomes ʇxǝʇ. Those are four distinct codepoints that a font draws in a rotated shape, not a transformed version of text.

What the four operations actually do

This tool offers four transforms. They are easy to confuse because the words overlap, so here is each one on the same input, Hello World.

Each operation applied to Hello World (11 characters, one space).
OperationUnitOutput
Reverse charactersgraphemedlroW olleH
Reverse wordswhitespace-separated tokenWorld Hello
Reverse lineslineHello World (unchanged, one line)
Flip upside downgrapheme, then substituteplɹoM ollǝH

Reverse-characters and flip both walk the string right to left. The difference is that flip also replaces each glyph with its rotated lookalike. Reverse-words keeps letters inside each word in normal order and only swaps the word positions. Reverse-lines does nothing to a single line, which is a common surprise.

When to use it, and when not to

Reversal by word or line is genuinely useful for restructuring data. If you have a list of "Lastname Firstname" and want "Firstname Lastname," reverse-words does it in one pass. If you exported log lines newest-last and want newest-first, reverse-lines is the fastest fix that keeps each line intact.

Character reversal is mostly for puzzles, palindrome checks, and quick obfuscation that any reader can undo. Upside-down text is decoration: profile bios, playful captions, a novelty username. It is not encryption and not compression. Anyone can copy it and flip it back.

Do not use upside-down text for anything a machine must read. Screen readers announce the substituted codepoints literally, so ʇxǝʇ is read as the Latin letters "turned t, x, turned e, turned t," which is meaningless to a listener. Search engines index the raw codepoints too, so flipped text is invisible to normal search.

Why the unit of reversal decides everything

A string is a sequence of Unicode codepoints, but what you see on screen is a sequence of grapheme clusters. A grapheme cluster is one user-perceived character. Often it is one codepoint. Often it is several.

Codepoint
A single Unicode scalar value, such as U+0065 (e) or U+0301 (combining acute accent).
Grapheme cluster
One or more codepoints that together form one visible unit, defined by Unicode Standard Annex #29. The letter é written as e + combining accent is two codepoints but one grapheme.
Naive reversal
Reversing by codepoint (or worse, by UTF-16 code unit). This tears combining marks off their base letters and splits multi-codepoint emoji.

Take the string café where é is stored as e (U+0065) followed by U+0301, the combining acute accent. That is 5 codepoints for 4 visible characters. Reverse it by codepoint and you get U+0301, é... the accent lands on the wrong letter or floats alone. Reverse it by grapheme and é stays whole, giving you éfac.

The gap grows with emoji. A family emoji like 👨‍👩‍👧‍👦 is one grapheme built from four person emoji joined by three zero-width joiners (U+200D), which is 7 codepoints and 11 UTF-16 code units. Reverse it by UTF-16 code unit and you get a burst of broken half-emoji. Reverse it by grapheme and it survives as one symbol.

n_{\text{graphemes}} \le n_{\text{codepoints}} \le n_{\text{UTF-16 units}} \le n_{\text{bytes}}

This chain holds for any string. n_{\text{graphemes}} is what you count with your eyes. n_{\text{codepoints}} is the Unicode scalar count. n_{\text{UTF-16 units}} counts the 16-bit units JavaScript strings use natively. n_{\text{bytes}} is the UTF-8 encoded size. Correct reversal operates on the leftmost quantity; buggy reversal operates on one of the others.

The same visible symbol is 1, 7, 11, or 25 units depending on what you measure. Reversal must use the leftmost bar to keep the emoji intact.

How the upside-down substitution works

Flipping is a two-step process. First the string is split into graphemes and reversed. Then each grapheme is looked up in a substitution table and replaced with a rotated lookalike where one exists.

The table is hand-built because Unicode was never designed for this. Some rotations are exact: o maps to itself, x maps to itself, s maps to itself. Some borrow letters from other scripts: a becomes ɐ, e becomes ǝ, t becomes ʇ, r becomes ɹ. Some have no good match and fall back to a near-lookalike or stay unchanged. Digits, brackets and quotation marks get their own mappings, so ( becomes ) and vice versa.

Because the mapping is one glyph in, one glyph out, upside-down text usually has the same grapheme count as the input. It is longer in bytes, though, because the rotated codepoints sit high in Unicode and encode to 2 or 3 UTF-8 bytes each instead of 1.

Worked example with the demo data

Reversing and flipping Hello World

The demo button uses the field defaults with the sample Hello World, 11 graphemes including one space. Follow the character reversal and the flip side by side.

  1. Split into graphemes: H e l l o (space) W o r l d, 11 units.
  2. Reverse the order: d l r o W (space) o l l e H.
  3. Join for reverse-characters: dlroW olleH.
  4. For flip, substitute each reversed grapheme: d to p, l to l, r to ɹ, o to o, W to M, space to space, then o, l, l, e to ǝ, H to H.
  5. Join for flip: plɹoM ollǝH.

Notice that reverse-words on the same input gives World Hello: the two words swap places but their letters stay forward. Three operations, three different outputs, one input.

Explore how the reversal unit changes the output

With café👨‍👩‍👧‍👦 as input (where é is e plus a combining accent), grapheme reversal gives 👨‍👩‍👧‍👦éfac with the emoji and accent intact. Codepoint reversal gives a broken accent floating before fac and a shattered emoji. UTF-16 reversal is worse still, splitting the emoji into stray surrogate halves.

Common mistakes

The most frequent error is expecting reverse-lines to change a single-line input. It cannot: reversing one line leaves one line. Split your text onto separate lines first, then reverse.

The second is trusting upside-down text to hide information. It is a costume, not a lock. If the content matters, do not flip it and assume it is private.

The third is round-trip loss on flipped text. Flipping is not perfectly reversible because several letters share one rotated glyph and some inputs have no mapping and pass through unchanged. Flipping ʇxǝʇ back does recover text here, but rare glyphs may not survive a second flip. Keep the original if you need it.

The fourth is assuming reversed text is still valid for its original purpose. A reversed URL, phone number, or code identifier is just a different string. Reversal is a display and puzzle transform, not a formatting one.

Related tools

Reversal pairs well with a few neighbours. To sort, dedupe or reverse whole lines with more control than a single flip, use Line Tools: Dedupe, Sort & Shuffle. To change letter case at the same time, reach for the Case Converter. If you want to strip the accents that make grapheme handling tricky, the Accent & Diacritic Remover turns café into cafe first. For pattern-based rearranging beyond simple reversal, try Find & Replace with Regex, and for cutting or padding lines to a fixed width use Truncate, Pad & Wrap.

Frequently asked questions

Why does my emoji break in other reverse tools but not here?

Most quick reversers operate on JavaScript's native UTF-16 code units. A family emoji is 11 such units, so reversing them scatters surrogate halves and zero-width joiners. This tool reverses by grapheme cluster, so the emoji stays as one unit.

Can screen readers read upside-down text?

They read the underlying codepoints, which are rotated lookalikes from various scripts, not the letters you intended. The result is announced as unrelated symbols and is effectively unreadable. Never use flipped text for accessible content.

Is upside-down text a font or actual characters?

Actual characters. No font trickery is involved. Each flipped letter is a distinct Unicode codepoint that already looks rotated, so it survives copy and paste into almost any app.

Why is reverse-lines doing nothing to my text?

You likely have a single line. Reversing the order of one item leaves it unchanged. Put each item on its own line first, then reverse.

Does any of this send my text to a server?

No. Every operation runs in your browser. Nothing you paste leaves your device.