Detect and remove invisible characters, including zero width spaces

Find hidden characters in pasted text, see each one as a code point, and remove or replace them by type.

How it works

  1. Paste the text to check
  2. Choose what to remove, replace or keep for each type
  3. Copy the cleaned text or read the marked text

What it finds and how it cleans

To remove invisible characters, paste the text and copy the cleaned result: the tool finds zero width spaces and joiners, direction controls, odd spaces, soft hyphens, tag characters and other hidden format characters, and takes out the ones you choose. Each type has its own choice. Zero width characters (U+200B, 200C, 200D, 2060 and FEFF), direction controls (U+200E, 200F, 061C, 202A to 202E, 2066 to 2069), soft hyphens (U+00AD), tag characters (U+E0000 to E007F) and other invisible format characters (such as U+2061 to 2064) are removed by default. Odd spaces (U+00A0, 2000 to 200A, 202F, 205F and 3000) are replaced with a normal space, so words stay apart. Every choice can be set to Keep.

Marked text and the list of characters

The second box shows your text with every hidden character written out, for example ⟦U+200B⟧ for a zero width space, so you can see where each one sits. The table lists each code point once, with its name, its type, how many times it appears and the line and column of the first five. For the text Price: followed by a no-break space, 100 and a zero width space, the cleaned text is Price: 100, the tool reports 2 characters found, 1 removed and 1 changed to a space, and the marked text is Price:⟦U+00A0⟧100⟦U+200B⟧. Columns count characters, so an emoji counts as one.

Emoji, other scripts and report-only characters

A zero width joiner is what builds a family or a profession emoji out of several people, so by default a joiner between two emoji is kept and only stray joiners are removed. Joiners and non-joiners are also part of correct spelling in scripts such as Persian and Hindi, and direction marks can be needed in Arabic and Hebrew text, so set those types to Keep for such text. Some characters are listed but never changed: variation selectors (U+FE00 to FE0F, which also sit inside most emoji), Arabic and Syriac format marks that show as symbols, and blank-looking letters such as the Hangul filler U+3164 and the blank Braille pattern U+2800. Tag characters can each stand for an ASCII letter, so text that looks empty can still carry letters; the name column shows which letter.

Using it with AI text, and what it cannot tell you

Text copied from chat tools, web pages, PDFs and word processors can carry hidden characters that break a search, a spreadsheet lookup, a diff or a prompt you paste into an AI tool or an agent. A plain-looking name with a no-break space does not match the same name typed with a normal space. This page makes those characters visible and removes them. Finding one does not show who or what wrote the text: keyboards, emoji, right-to-left text and copy and paste all produce them, so use the result only to clean text. The tool checks the characters listed above, not every Unicode character that can look blank, and it accepts up to 1,000,000 characters.

Frequently asked questions

How do I remove a zero width space from text?

Paste the text and copy the Cleaned text box. Zero width characters (U+200B, 200C, 200D, 2060 and FEFF) are removed by default. The Marked text box and the table show where each one was, such as 1:12 for line 1, column 12.

How do I find hidden characters in text copied from ChatGPT?

Paste the reply and read the table under the results. It lists every hidden code point found, for example U+00A0 NO-BREAK SPACE with its count. The marked text writes each one as ⟦U+00A0⟧ in place. Many replies contain none, and a result of 0 found is normal.

Does a zero width space mean the text was written by AI?

No. Zero width and other hidden characters come from keyboards, emoji, web pages, PDFs and word processors as well as from any writing tool. This tool shows which characters are in the text and cannot show who or what wrote it.

Why is a no-break space replaced with a normal space, not deleted?

Deleting U+00A0 would join the words on each side, so Price: 100 written with a no-break space would become Price:100. The default replaces it with one normal space. Choose Remove under Odd spaces if you want it deleted, or Keep to leave it.

Why was the joiner in my emoji not removed?

A zero width joiner between two emoji, as in a family emoji built from 3 people, is part of the picture, so it is kept while Keep joiners inside emoji is on. Turn that option off, or choose Keep or Remove under Zero width characters, to change it.

Is my text uploaded?

No. It is processed in your browser, in this tab, and no server receives it. Your choices are saved in this browser, the text is not.