AI Text Cleaner — Remove Hidden Characters from AI Text
Paste anything you copied out of a chat window. See exactly which invisible characters are hiding inside it, then copy the clean version.
Hidden character report
Paste text to scan
What an AI text cleaner actually removes
Text copied out of a chat window is not plain text. It carries a thin layer of characters you cannot see: zero-width spaces between words, directional marks that steer the order of a line, soft hyphens waiting to appear at a line break, and non-breaking spaces that look identical to ordinary ones. None of them show up on screen, and all of them survive a paste into your editor, your CMS or your email client.
This tool separates that layer from the words. It reads your text one character at a time, matches every code point against a published table of invisible characters, and reports what it found before handing you the cleaned version. Nothing is guessed and nothing is rewritten — only the characters listed in the table below are touched.
How to clean your text in three steps
Paste your text into the left box. The tool does not start working until you ask it to, so you can look at what you pasted first.
Press Clean. The right box fills with the cleaned text, and the report underneath lists every character that was removed or replaced, with its Unicode code point and how many times it appeared. If your text was already clean, the report says so instead of inventing rows.
Press Copy to put the cleaned text on your clipboard. Your original stays in the left box so you can compare the two side by side before you commit to anything.
Why invisible characters end up in AI text
Chat interfaces render rich text, not plain text. Streamed answers are assembled from fragments, and the renderer inserts invisible markers to keep words from breaking in the wrong place, to hold emoji sequences together, and to handle mixed writing directions correctly. That is a reasonable thing for a renderer to do.
The trouble starts at the copy button. When you copy a rendered paragraph, the browser takes the character stream, not the picture you were looking at. Every marker the renderer added comes with it. Most editors show nothing unusual — until a word refuses to wrap, a sentence looks reversed, or a search for a phrase you can plainly see returns no results.
Where clean text matters
Publishing is the obvious case. A stray non-breaking space inside a headline can push a line past its container; a bidirectional override left in the middle of a paragraph can flip the punctuation around it. Both look like a styling bug and neither is one.
It matters just as much for anything machine-read: spreadsheet imports that silently drop rows, search indexes that miss a phrase, diff tools that report a whole line as changed when a single invisible character moved, and support tickets where a customer's error message will not match your logs.
Characters this tool looks for
25 invisible characters and formatting controls, with the action taken on each one.
| Character | Code point | Action | What it does |
|---|---|---|---|
| Zero-width characters | |||
| Zero Width Space | U+200B | Removed | Invisible separator with no width. Commonly left behind when text is copied out of a chat window. |
| Zero Width Non-Joiner | U+200C | Removed | Invisible character that blocks two letters from joining in scripts such as Arabic or Devanagari. |
| Zero Width Joiner | U+200D | Removed | Invisible character used to glue emoji sequences together. Stray copies can break word wrapping. |
| Zero Width No-Break Space (BOM) | U+FEFF | Removed | Byte order mark. Harmless at the start of a file, invisible noise anywhere else. |
| Word Joiner | U+2060 | Removed | Tells a text engine not to break a line here. Invisible, and easy to carry along by accident. |
| Mongolian Vowel Separator | U+180E | Removed | A legacy invisible separator from Mongolian script that now renders as nothing at all. |
| Bidirectional controls | |||
| Left-to-Right Mark | U+200E | Removed | Directional hint for mixed-script lines. Invisible on screen but present in the character stream. |
| Right-to-Left Mark | U+200F | Removed | Mirror of the left-to-right mark, used to steer the order of mixed-direction text. |
| Arabic Letter Mark | U+061C | Removed | Invisible directional marker for Arabic text. Rarely intentional outside its original document. |
| Left-to-Right Embedding | U+202A | Removed | Opens an embedded left-to-right run. Unpaired copies can scramble the order of a sentence. |
| Right-to-Left Embedding | U+202B | Removed | Opens an embedded right-to-left run. Left behind after copy-paste, it can flip nearby punctuation. |
| Pop Directional Formatting | U+202C | Removed | Closes an embedded directional run. Without its partner it is pure invisible noise. |
| Left-to-Right Override | U+202D | Removed | Forces following characters to display left-to-right regardless of their own direction. |
| Right-to-Left Override | U+202E | Removed | Forces following characters to display right-to-left. A common cause of text that looks reversed. |
| Left-to-Right Isolate | U+2066 | Removed | Modern replacement for the embedding controls. Still invisible, still travels with copied text. |
| Right-to-Left Isolate | U+2067 | Removed | Isolates a right-to-left run from the surrounding paragraph direction. |
| First Strong Isolate | U+2068 | Removed | Isolates a run whose direction is decided by its first strong character. |
| Pop Directional Isolate | U+2069 | Removed | Closes an isolate opened by one of the isolate controls above. |
| Formatting controls | |||
| Soft Hyphen | U+00AD | Removed | A hyphen the reader only sees if the word happens to break at the end of a line. |
| Carriage Return (CR) | U+000D | Removed | Half of a Windows line ending. Kept on its own it produces doubled spacing in most editors. |
| Markdown Asterisk Marker | U+002A | Removed | Bold or italic marker such as ** left behind when text is copied in its raw form. Turn this group off to keep Markdown styling marks. |
| Markdown Backtick Marker | U+0060 | Removed | Inline-code backtick left behind after copying raw assistant output. Turn this group off to keep inline code marks. |
| Invisible spaces | |||
| No-Break Space | U+00A0 | → space | Looks exactly like a space but stops a line from breaking there. A frequent copy-paste leftover. |
| Figure Space | U+2007 | → space | A space as wide as a digit, used to align numbers in tables. Replaced with a normal space. |
| Narrow No-Break Space | U+202F | → space | A thin, non-breaking space from French typography. Replaced with a normal space. |
Frequently Asked Questions
▸What counts as a hidden character?
Anything in our published table: zero-width spaces and joiners, the byte order mark, directional marks and embedding controls, soft hyphens, and three kinds of invisible space. The table lists every one of them with its code point, and the report tells you which ones were present in your text.
▸Does this tool upload or store my text?
No. The cleaning runs as ordinary JavaScript inside the page you are already looking at. There is no server to send it to, nothing is written to your device, and refreshing the page clears everything. You can confirm this yourself by watching the network panel while you press Clean.
▸Will cleaning change my wording?
No. Words, punctuation, capitalisation, line order and emoji are untouched. The only characters that change are the invisible ones in the table. Long runs of spaces and blank lines are also tightened, and the report counts those separately so you can see exactly what happened.