AI Text Cleaner
How it works
What gets cleaned
Four groups of typography are normalized to plain ASCII: curly quotes (single, double, low-9, guillemets) become straight quotes; the dash family (em, en, figure, horizontal bar, minus sign, hyphen variants) becomes a plain hyphen; the ellipsis character becomes three dots; and exotic spaces (no-break, narrow no-break, the whole U+2000 block) become a regular space. Separately, invisible characters are removed: zero width space, BOM, word joiner and soft hyphen always; zero width joiners and directional marks only where both neighbors are ASCII, so a family emoji (which is glued together by zero width joiners) and legitimate RTL text survive untouched. The ideographic space U+3000 used for CJK indentation is deliberately left alone.
Why invisible characters end up in your text
Copying from rendered web pages and PDFs drags along soft hyphens and directional marks; word processors insert no-break spaces around punctuation; and text passed through LLMs can carry zero-width spaces — sometimes discussed as a way to watermark or fingerprint generated text. None of them are visible, but they break string comparison, grep, deduplication and diff, and they survive copy-paste indefinitely. INSPECT shows each one with its codepoint and line/column position, so you can see exactly what a 'clean-looking' string actually contains.
Why smart quotes break code
Word processors and LLMs both emit typographic quotes: “ ” instead of " ". Paste those into a shell, a JSON document, a config file or source code and the parser sees an unknown character, not a string delimiter — JSON.parse throws 'Unexpected token', bash reports 'command not found' on what looks like a perfectly quoted argument. The same goes for the em-dash pasted into a CLI flag (–verbose is not --verbose). Cleaning them back to ASCII makes text safe for any technical context.
Examples
| “It’s done” — finally… | "It's done" - finally... |
| invisiblemarker (contains U+200B) | invisiblemarker |
| INSPECT mode | line 1, col 10 U+200B ZERO WIDTH SPACE |
FAQ
Will cleaning break my emoji?
No. Multi-person emoji like 👨👩👧 are glued together with zero width joiners. Those joiners are removed only when both neighbors are plain ASCII — inside an emoji sequence the neighbors are emoji, so the sequence is left intact.
Does this remove AI watermarks?
It removes the specific mechanism sometimes described as text watermarking: invisible Unicode characters (zero width spaces, joiners, directional marks) hidden between visible letters. INSPECT shows where they are; CLEAN strips them. Statistical watermarks embedded in word choice are a different thing and no character-level tool can touch those.
Why is my text 'identical' but fails comparison?
Two strings can render identically and differ in bytes: one has a no-break space or a zero-width character where the other has nothing or a plain space. Run both through INSPECT to see the difference, or CLEAN both and compare again — the Text Diff tool on this site works well for the before/after.
Is Chinese / Japanese / RTL text safe?
Yes, by design. The ideographic space (U+3000) used for CJK indentation is never touched, and joiners or directional marks are only removed when surrounded by ASCII on both sides — inside Arabic, Hebrew or Indic text they are preserved.
Is my text uploaded to a server?
No. The page ships a strict Content-Security-Policy: connect-src 'none' blocks fetch, XHR, WebSockets and beacons, while default-src 'self' and form-action 'none' block every other way markup could send data off-site. Cleaning happens in your browser and cannot leave it.