Invisible character remover
Paste text and every non-printing character in it is listed by name, code point and position before anything is removed. Zero-width spaces, soft hyphens, directional marks and the exotic spaces all show up; your accented letters, CJK and right-to-left text do not move.
Where the hidden characters come from
Almost none of them were typed. A zero-width space is inserted by publishing systems as a hint about where a long word or URL may break. A soft hyphen is left behind by justified text in Word or InDesign, marking a hyphenation point that only appears when the line needs it. A byte order mark sits at the front of a file saved as UTF-8 by a Windows editor, and travels with the first cell when you copy a spreadsheet.
Directional marks come from anything that has been near right-to-left text: a Hebrew or Arabic phrase in an otherwise English document arrives wrapped in invisible controls that tell the renderer where the direction changes. Translation memory tools and localisation platforms add them liberally, and they are copied along with the words.
The reason to care is that none of this is visible while you debug. A search for a word that is plainly on screen returns nothing. Two identical-looking lines refuse to deduplicate. A CSV import fails on a header that looks perfectly ordinary. In every one of those cases the character is there in the string, and this page will name it and tell you which line and column it is sitting in.
The narrow no-break space and the watermark story
U+202F, the narrow no-break space, is the character that gets called an AI watermark. It began turning up in chatbot output — often before a colon or a percent sign — and since almost nobody types it deliberately, its presence looked like a signature.
It almost certainly is not one. The narrow no-break space is an ordinary typographic character with a long-established job: French typography puts it before a colon, a semicolon, an exclamation mark and a question mark, and it is used as a thousands separator in several conventions. A model trained on well-typeset text has seen a great deal of it. No vendor has claimed to be marking text this way, and it would be a strange choice if one wanted to: a watermark that any text box strips on paste, that this page removes in a click, and that never survives a retype is not much of a watermark.
That said, removing it is usually right, because it is a no-break space and things that expect a normal space do not recognise it. Here it becomes an ordinary space rather than disappearing, so 10 % does not turn into 10% and words either side of it never weld together.
What this tool refuses to remove
A zero-width joiner is junk between two Latin letters and load-bearing between two emoji: it is the character that makes a family emoji one glyph instead of four. It does the same work in Devanagari, Arabic, Bengali and a dozen other scripts, where it selects which form a letter takes. So a joiner is removed when its neighbours are Latin letters and kept when they are emoji or letters of a script that joins — and the report says which of the two happened.
Variation selectors are left alone entirely. U+FE0F is what makes a heart render as a red emoji rather than a black dingbat, and stripping it visibly changes the text. So is U+3000, the ideographic space, which is a real character of visible width in Japanese and Chinese typesetting rather than an accident of copying.
Everything printable is untouched by definition. Accented Latin, Greek, Cyrillic, Hebrew, Arabic, Thai and CJK characters are ordinary letters, and the only things this removes are the controls and the zero-width characters in the table below. The bidirectional controls are the exception worth knowing about: they are removed, and in a document that mixes English and Hebrew that can change how a line is laid out — which is exactly why the ones found are listed before you press the button.
What a scan actually tells you
The line The invoice subtotal is 10 %. looks entirely ordinary and holds four
characters that are not. Pasting it into the box above produces the list below, generated here
by the same function the page runs:
| Character | Name | Count | First seen | What happens |
|---|---|---|---|---|
U+00A0 | No-break space | 1 | line 1, column 4 | Becomes a space |
U+00AD | Soft hyphen | 1 | line 1, column 30 | Removed |
U+200B | Zero-width space | 1 | line 1, column 16 | Removed |
U+202F | Narrow no-break space | 1 | line 1, column 28 | Becomes a space |
Every character the scanner knows
Anything not on this list is a printable character and is left exactly where it is.
| Code point | Name | What happens to it |
|---|---|---|
U+0000–U+0008 | Control character | Removed |
U+000B–U+000C | Vertical tab or form feed | Removed |
U+000E–U+001F | Control character | Removed |
U+007F | Delete control character | Removed |
U+00A0 | No-break space | Becomes an ordinary space |
U+00AD | Soft hyphen | Removed |
U+061C | Arabic letter mark | Removed |
U+115F–U+1160 | Hangul filler | Removed |
U+180E | Mongolian vowel separator | Removed |
U+2000 | En quad | Becomes an ordinary space |
U+2001 | Em quad | Becomes an ordinary space |
U+2002 | En space | Becomes an ordinary space |
U+2003 | Em space | Becomes an ordinary space |
U+2004 | Three-per-em space | Becomes an ordinary space |
U+2005 | Four-per-em space | Becomes an ordinary space |
U+2006 | Six-per-em space | Becomes an ordinary space |
U+2007 | Figure space | Becomes an ordinary space |
U+2008 | Punctuation space | Becomes an ordinary space |
U+2009 | Thin space | Becomes an ordinary space |
U+200A | Hair space | Becomes an ordinary space |
U+200B | Zero-width space | Removed |
U+200C | Zero-width non-joiner | Removed, unless it is joining emoji or letters of a script that needs it |
U+200D | Zero-width joiner | Removed, unless it is joining emoji or letters of a script that needs it |
U+200E | Left-to-right mark | Removed |
U+200F | Right-to-left mark | Removed |
U+202A–U+202E | Bidirectional formatting control | Removed |
U+202F | Narrow no-break space | Becomes an ordinary space |
U+205F | Medium mathematical space | Becomes an ordinary space |
U+2060 | Word joiner | Removed |
U+2061–U+2064 | Invisible mathematical operator | Removed |
U+2066–U+2069 | Bidirectional isolate control | Removed |
U+3164 | Hangul filler (halfwidth block) | Removed |
U+FEFF | Zero-width no-break space (byte order mark) | Removed |
U+FFA0 | Halfwidth Hangul filler | Removed |
U+E0000–U+E007F | Unicode tag character | Removed |
Common questions
How do I find invisible characters in text?
Paste it into the box. Every non-printing character is listed as you type, with its Unicode name, its code point and the line and column where it sits — before anything is changed.
Is there a hidden watermark in ChatGPT output?
No vendor has said so, and the character usually named as one — the narrow no-break space, U+202F — is a legitimate typographic space that appears widely in well-set text. A mark that vanishes on a retype would not be a useful watermark anyway.
Will this damage emoji or non-English text?
No. Letters in every script are printable characters and are never touched, and the zero-width joiner is kept wherever it is doing a job — inside a multi-part emoji, or between letters of a script that joins.
Why does a search fail on a word I can clearly see?
Because something invisible is sitting inside it — most often a zero-width space or a soft hyphen left by a word processor. The scan will name it and give you its position, and stripping it makes the word findable again.
Other text tools
- Case converterAll tools
- Sentence case converterCase
- Title case converterCase
- Uppercase converterCase
- Lowercase converterCase
- camelCase converterCode
- Snake case converterCode
- Kebab case converterCode
- Remove line breaksLines
- Remove extra spacesLines
- Sort lines alphabeticallyLines
- Remove duplicate linesLines
- Reverse textLines
- Word counterCount
- Clean up AI textAI text
- Em dash removerAI text
- Smart quote converterAI text
- Markdown formatting removerAI text