Skip to content

Unicode Inspector

Find the zero-width spaces, direction overrides, look-alike letters and stray control characters that make two identical-looking strings compare unequal.

Everything on this page runs in your browser. Nothing you paste is uploaded, logged, or written into the URL — only the settings are, so a configured tool can still be linked to.

Clean-up to apply belowThe input above is never modified; the cleaned copy is separate.
Characters worth looking at
6

4 of them are completely invisible in your editor. 71 code points across 71 UTF-16 units.

Code points
71
UTF-16 code units (JavaScript's .length)
71
UTF-8 bytes
80
Characters outside ASCII
6
Invisible / zero-width
2
Direction controls
2
Spaces that are not U+0020
1
Latin look-alikes
1
Already in normal form C
yes
  • errorline 1, column 3 · U+200BZERO WIDTH SPACE — invisible, and the single most common cause of a string comparison that should have matched

    Expected: nothing at this position, unless you put it there deliberately

    This invoice is over­due.⏎Pa
  • warnline 1, column 22 · U+00ADSOFT HYPHEN — invisible unless the line wraps here, and it survives copy and paste

    Expected: nothing at this position, unless you put it there deliberately

    Th​is invoice is over­due.⏎Pay now at examplе.co
  • warnline 2, column 4 · U+00A0NO-BREAK SPACE — looks exactly like a space and is not one; splitting on " " leaves it attached to the word

    Expected: U+0020 SPACE, if this was meant to be an ordinary space

    s invoice is over­due.⏎Pay now at examplе.com⏎Amount
  • warnline 2, column 18 · U+0435looks like Latin "e" and is not — renders identically to "e" in most fonts but is a different code point, so any comparison against the Latin spelling fails — and a domain or a command written this way is not the one it appears to be

    Expected: the Latin letter it is imitating

    ver­due.⏎Pay now at examplе.com⏎Amount due: ‮123‬ USD
  • errorline 3, column 13 · U+202ERIGHT-TO-LEFT OVERRIDE — invisible, and can make text display in an order completely different from the order it is stored in — the trick behind reversed filenames and the Trojan Source class of attacks

    Expected: nothing at this position, unless you put it there deliberately

    t examplе.com⏎Amount due: 123‬ USD
  • warnline 3, column 17 · U+202CPOP DIRECTIONAL FORMATTING — invisible; closes a direction override

    Expected: nothing at this position, unless you put it there deliberately

    amplе.com⏎Amount due: ‮123 USD
Cleaned copy4 characters removed, 1 replaced.
This invoice is overdue.
Pay now at examplе.com
Amount due: 123 USD
What this checked: this walks your text code point by code point and names every one that is invisible, is a space other than U+0020, is a control character, is a direction control, is a lone surrogate, sits in the private use area, is a combining mark, or is a Cyrillic or Greek letter that renders like a Latin one — each with its line, column and code point. It also tells you whether the string is in normal form C. It does not validate the text against any grammar, does not detect an encoding (by the time text reaches this page it is already a JavaScript string; row 934 is the page for bytes that were decoded wrongly), and its look-alike table covers the common Cyrillic and Greek confusables rather than the full Unicode confusables set — so an absence of look-alike findings is not proof there are none.
What this assumes: that U+0020 is the space you meant and NFC is the normal form you want, which is true of almost all Western text and not automatically true of anything else. Zero-width non-joiners and joiners are flagged as noise because in English prose they are; in Persian, Hindi or an emoji sequence they are load-bearing, and removing them changes the meaning. Nothing is removed from your input — the cleaned copy below is a separate string.

Why an invisible character is worse than a visible bug

A zero-width space between the h and the i of "this" costs nothing to produce — a word processor, a wiki, a copy out of a rendered web page — and it survives every step of a pipeline unchanged. It makes a string comparison fail, a dictionary lookup miss, a cache key differ from the key you expected, and a tokenizer split one word into two, which quietly raises the token count of every prompt built from that text. None of those failures print anything you can search for. The only reliable way to find one is to look at the code points, which is what this page does.

The two that are security problems, not tidiness problems

A right-to-left override makes stored text display in an order it is not stored in, which is how a file called gnp.exe shows up as a PNG and how a comment in source code can render as if it ended where it did not. Tag characters are worse for anything involving a language model: each one carries an ASCII letter, they are completely invisible to a human reviewer, and a model reads them as text. A document that looks harmless on screen can carry a paragraph of instructions in them. If your system ingests text that other people wrote, stripping both of those at the boundary is a one-line change with no downside worth arguing about.

Unicode Inspector · Multigrid