Remove Invisible Characters & AI Watermarks from Text
Paste AI-generated text and instantly strip zero-width characters, hidden Unicode watermarks, em dashes, smart quotes and other tell-tale artifacts. Everything runs locally in your browser.
🔒 Runs 100% in your browser — your text never leaves this page.
What TextPurify detects and removes
AI writing tools and rich-text editors quietly insert dozens of special Unicode characters into text. Some are harmless typography; others are invisible characters that can be used to fingerprint or watermark AI-generated content. TextPurify scans every single character against a table of known offenders:
🫥 Invisible & zero-width characters
Zero-width spaces (U+200B), joiners, word joiners, soft hyphens, directional marks, byte-order marks and Unicode tag characters — all invisible to the eye, all detectable by software.
👻 Non-standard spaces
The narrow no-break space (U+202F) that ChatGPT is known to insert, non-breaking spaces, thin spaces, hair spaces and eleven other lookalikes — normalized to a plain space.
➖ Em dashes & exotic dashes
The em dash (—) is the single most cited "AI tell". Convert it to a comma, hyphen or space — your choice. En dashes, minus signs and horizontal bars are normalized too.
❝ Smart quotes & punctuation
Curly “smart” quotes become straight quotes, the ellipsis character (…) becomes three honest dots, guillemets and primes are straightened.
🧾 Markdown leftovers
Optionally strip **bold**, *italic*, # headings, `inline code` and [link](url) markers that AI chats leave behind when you paste into plain-text fields.
🛡️ Emoji & language safe
Smart guards keep emoji sequences (👨👩👧), emoji variation selectors (❤️) and joining characters in Persian, Arabic and Indic scripts intact. Cleaning never breaks legitimate text.
Invisible character reference
These are the most common hidden characters found in AI-generated and copy-pasted text, and what TextPurify does with each:
| Code point | Name | Why it shows up | Action |
|---|---|---|---|
U+200B | Zero-width space | Invisible word breaks; classic text watermark | Removed |
U+200C | Zero-width non-joiner | Watermarking; legitimate in Persian/Indic text (kept there) | Removed* |
U+200D | Zero-width joiner | Watermarking; legitimate in emoji sequences (kept there) | Removed* |
U+2060 | Word joiner | Invisible no-break glue | Removed |
U+FEFF | Zero-width no-break space (BOM) | File-encoding artifact pasted into text | Removed |
U+00AD | Soft hyphen | Invisible hyphenation hint | Removed |
U+200E / U+200F | Directional marks (LRM/RLM) | Copy-paste from bidirectional text | Removed |
U+E0000–U+E007F | Unicode tag characters | Can encode entire hidden messages inside text | Removed |
U+FE00–U+FE0F | Variation selectors | Invisible glyph modifiers (kept for emoji) | Removed* |
U+202F | Narrow no-break space | Frequently seen in ChatGPT output | → space |
U+00A0 | Non-breaking space | Rich-text editors and HTML | → space |
U+2000–U+200A | En/em/thin/hair spaces | Typography-grade spaces | → space |
U+2014 | Em dash | The most famous AI writing tell | → comma / hyphen / space (your choice) |
U+2013 | En dash | Ranges and typography | → hyphen |
U+2018 / U+2019 / U+201C / U+201D | Curly quotes | Smart-quote auto-correction | → straight quotes |
U+2026 | Horizontal ellipsis | Single-character "…" | → three dots |
* Kept automatically when part of an emoji sequence or between letters of joining scripts (Persian, Arabic, Hindi, etc.).
Frequently asked questions
Why does AI-generated text contain invisible characters?
Several reasons: the model's training data contains them, the chat interface inserts typographic characters (narrow no-break spaces, curly quotes) for nicer rendering, and some tools deliberately embed zero-width characters or Unicode tags as a fingerprint. Whatever the cause, they survive copy-paste and can be detected by plagiarism checkers, spam filters and AI detectors.
Does ChatGPT watermark its text?
OpenAI has not announced a production Unicode watermark, but users have repeatedly observed special characters such as the narrow no-break space (U+202F) in ChatGPT output, and third-party tools do use zero-width characters to tag text. Cleaning them is harmless for normal text, so removing them before publishing is a sensible default.
Will cleaning break my emoji or non-English text?
No. TextPurify has explicit guards: zero-width joiners inside emoji sequences (👨👩👧), emoji variation selectors (❤️) and joining characters between Persian, Arabic or Indic letters are automatically preserved.
Is my text uploaded to a server?
Never. The entire cleaner is a small JavaScript module that runs inside your browser tab. Your text does not leave your device, which also means it works offline once the page is loaded.
How do I remove em dashes from ChatGPT text?
Paste your text above and choose what the em dash (—) should become: a comma (reads most naturally), a plain hyphen, or a space. There is also a dedicated Em Dash Remover page.
Can it also strip Markdown formatting?
Yes — enable the "Markdown leftovers" toggle to strip **bold**, *italic*, # headings, `inline code`, ~~strikethrough~~ and [link](url) markers. It is off by default because some people paste intentional Markdown.