MSRX Tools

Unicode Character Inspector

Find the invisible and look-alike characters hiding in a string.

Everything runs inside your browser. Your files never leave your device.

Input

Result

The result appears here as you type.

Ask about Unicode Character Inspector

Questions about what this tool does, which option to pick, or what it can and cannot handle.

The question you type here is sent to an AI provider to be answered — your files and whatever you put in the tool above are not, and the assistant cannot see them. Answers are generated and can be wrong. The tool itself is not guessing: it runs deterministic code on your device.

About the Unicode Character Inspector

Two strings look identical on screen and refuse to compare equal. A password that is definitely right is definitely rejected. A filename will not match. A JSON parser fails on a document that looks fine. The cause is almost always a character you cannot see.

This inspector lists every character in a string with its codepoint, its Unicode block, its UTF-8 bytes and how many of them it takes. More importantly, it flags the characters that cause exactly these problems. Zero-width spaces and joiners, which render as nothing at all. Byte-order marks, which arrive invisibly at the start of a file and break the first line of every parser. Non-breaking spaces, which look like spaces and are not. Line and paragraph separators, which are valid Unicode and invalid JavaScript string content.

It also names the look-alikes. Cyrillic small a is a different codepoint from Latin a and renders identically in most fonts. The same is true of Cyrillic e, o, p and c. That resemblance is the mechanism behind a whole family of phishing domains, and it is also how a copied-and-pasted identifier ends up failing a comparison it visibly ought to pass.

Smart quotes and dashes get flagged for a more mundane reason. A document editor silently converts a straight apostrophe into a typographic one and a double hyphen into an em dash, and code copied out of a formatted document then fails to compile with an error that names none of this.

Switch on grapheme grouping to see how the string divides the way a person reads it — a flag emoji is two codepoints, a family emoji can be seven joined by zero-width joiners, and a letter with an accent may be one codepoint or two depending on which normalisation form produced it.

How to use it

  1. 1Paste the string you are suspicious of. A short fragment is easier to read than a whole file.
  2. 2Read the table: each character with its codepoint, block and UTF-8 bytes.
  3. 3Switch on “only show flagged characters” to jump straight to what is likely to be causing the problem.
  4. 4Turn on grapheme grouping if the string contains emoji or combining accents and you want to see what counts as one character.

Questions

Why do two identical-looking strings not match?
Usually an invisible character in one of them, or a look-alike from another script. The other common cause is normalisation: an accented letter can be stored as one codepoint or as a letter plus a combining mark, and the two are different strings that render identically.
What is a zero-width space doing in my text?
It was probably inserted by a website as a soft line-break hint, or came in with text copied from a PDF. They are common in text pasted from web pages and completely invisible until something compares strings.
Why does an emoji count as several characters?
Because many are built from several codepoints joined together — a flag is two regional indicators, a family is several people joined by zero-width joiners, and a skin tone is a modifier applied to a base emoji. Grapheme grouping shows them the way a reader sees them.
Does the tool name every character?
It names the block every character belongs to, and gives a specific warning for the ones known to cause trouble. It does not carry the full Unicode name database, which is over a megabyte and would have to be downloaded to tell you something you can look up once a year.