Also available in: Español · Português · Français · العربية
Invisible Character Detector: Find Hidden Characters
Every invisible, ignorable and disguised character in your text, named, counted and located.
What is an invisible character?
An invisible character is a code point that takes up no visible space but is really there in the text. Some are useful: a zero-width joiner is what turns two emoji into one, and a soft hyphen marks where a word may break. Some are structural, like the bidirectional controls that let Arabic and English share a line. And some are there because somebody put them there.
They cause trouble because software sees them and you do not. A search that should match does not. Two strings that look identical compare as different. A copied API key gains a character somewhere in the middle and stops working, with nothing on screen to explain why.
This page finds them, names each one with its official Unicode name and code point, and tells you where in the text it sits. The example loaded above reads as twenty visible characters and is actually forty-nine code points long.
How to use it
- Paste the text. Anything: a message, a filename, a spreadsheet cell, a commit message that will not match a grep. It is checked in your browser and never uploaded.
- Read the table. Each row is one character, with its code point, its Unicode name, what kind of thing it is, how many times it occurs and where.
- Then remove them if you want. One button strips every hidden character, turning the odd spaces into ordinary ones rather than deleting them, so words that looked separate stay separate.
Why this finds more than a cleanup tool
Nearly every tool that removes invisible characters carries a hand-written list of the few its author had run into. That is true of the text cleaner on this site too: its list covers thirteen code points, and it is the reason this page exists.
Unicode publishes the real answer as a property called Default_Ignorable_Code_Point, which marks the characters a renderer is supposed to show nothing for. It covers 4,174 code points, and 405 of those are assigned characters with names. So a thirteen-character shortlist misses 392 named characters that are invisible by definition — all 260 variation selectors, the entire 97-character tag block, the combining grapheme joiner, the Arabic letter mark, the Hangul fillers.
Not everything worth flagging is ignorable, though, so the table says which authority each row rests on. A non-breaking space is perfectly visible as a space, but it is not the space a parser splits on, and a control character in the middle of a line is invisible without Unicode calling it ignorable. Both are reported, and both are marked as what they are.
The tag block, and text you cannot see
Ninety-seven characters between U+E0001 and U+E007F mirror ASCII exactly. Tag capital A is A plus a fixed offset, tag space is a space, and every one of them renders as nothing at all. They have a legitimate job inside emoji flag sequences, which is how the flags of England, Scotland and Wales are encoded.
They are also how a sentence gets carried inside text that looks completely ordinary. Paste something containing them here and the decoded line appears above, spelling out what was hidden. The example loaded on this page is exactly that: twenty visible characters carrying an instruction nobody can see.
This has become worth checking rather than a curiosity, because text now routinely gets pasted into systems that read every character rather than only the ones a person can see. Whether the hidden text is a watermark, a tracking marker or an instruction, the honest first step is being able to look at it.
What this page cannot tell you
It cannot tell you why a character is there. A zero-width joiner in the middle of an emoji is doing its job; the same character between two letters is not. The tool reports what is present and leaves the judgement to you, because the same code point is legitimate in one context and suspicious in another.
It also works on code points rather than what you might call letters. That is the right unit here — every tag character and every modern variation selector sits above the basic multilingual plane, so a detector that walked the text the naive way would split each one in half and find none of them — but it means a flag emoji or a skin-toned emoji counts as several code points rather than one symbol.
Finally, a clean result means nothing hidden that Unicode names. Text can still be deceptive in ways this page does not cover, most obviously by using letters from another alphabet that look identical to Latin ones. That is a different problem, and a different page.
Why is it free?
The character list is a few kilobytes shipped with the page, and the scan runs in your browser. Nothing you paste is uploaded, nothing is logged, and there is no account to make.
No sign-up, no limits, and no watermark on anything you copy out.