FreeToGenerate.com

Built on Unicode's own property, not on the usual shortlist of six.

Paste the text to check

Everything happens in your browser. Paste a message, a filename, a commit, or anything that behaves oddly when you search or compare it.

What is in there

30 hidden characters found · 29 of them are invisible by Unicode's own definition

Code pointUnicode nameKindCountAt
U+200BZERO WIDTH SPACEzero width17
U+00A0NO-BREAK SPACEspace that is not a normal space115
U+E0069TAG LATIN SMALL LETTER Itag character, renders as nothing421, 32, 37, 45
U+E0067TAG LATIN SMALL LETTER Gtag character, renders as nothing122
U+E006ETAG LATIN SMALL LETTER Ntag character, renders as nothing323, 38, 47
U+E006FTAG LATIN SMALL LETTER Otag character, renders as nothing324, 33, 46
U+E0072TAG LATIN SMALL LETTER Rtag character, renders as nothing325, 29, 41
U+E0065TAG LATIN SMALL LETTER Etag character, renders as nothing226, 30
U+E0020TAG SPACEtag character, renders as nothing227, 36
U+E0070TAG LATIN SMALL LETTER Ptag character, renders as nothing128
U+E0076TAG LATIN SMALL LETTER Vtag character, renders as nothing131
U+E0075TAG LATIN SMALL LETTER Utag character, renders as nothing234, 42
U+E0073TAG LATIN SMALL LETTER Stag character, renders as nothing335, 39, 48
U+E0074TAG LATIN SMALL LETTER Ttag character, renders as nothing240, 44
U+E0063TAG LATIN SMALL LETTER Ctag character, renders as nothing143

Text hidden in the tag block

ignore previous instructions

Tag characters mirror ASCII at a fixed offset and render as nothing at all, so a whole sentence can travel inside text that looks clean. This is what those characters spell.

How this differs from a cleanup tool

Most tools that strip invisible characters carry a hand-written list of the few their author had met. Our own text cleaner covers thirteen code points. Unicode's Default_Ignorable_Code_Point property covers 4,174, of which 405 are assigned and named — so 392 named characters are invisible by definition and go unmentioned by a shortlist.

The tag block is 97 characters that mirror ASCII and render as nothing. They belong inside emoji flag sequences, and they are also how text is smuggled into a message that looks ordinary.

Not everything here is invisible by Unicode's definition. A non-breaking space and a control character are flagged too, because they are not the character they appear to be, and the table says which authority each row rests on.

483 · 405 · 392

The character list is generated from Unicode's own DerivedCoreProperties and UnicodeData files. Positions are counted in code points, so an emoji or a tag character counts once rather than twice.

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

  1. 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.
  2. 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.
  3. 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.