Remove ChatGPT Formatting and See What Was Hiding in Your Text
Paste text below and this page lists every invisible character, odd space, curly quote and lookalike letter it can find, with codepoints, before it changes anything.
Most tools that remove ChatGPT formatting hand back a clean block and tell you nothing about what left. This one shows you the diagnosis first, then lets you decide which of the eight passes should run.
Short version
- See it first. The panel names each finding and its position, so you know what you are agreeing to lose.
- Nothing is uploaded. The page makes no network request. Open your network tab and watch.
- It will not fool a detector. Clean text because software breaks on these characters, not for a score.
Paste your text to remove ChatGPT formatting
Runs entirely in this browser tab. Your text is never sent anywhere, because this page has nowhere to send it.
0 characters
0 characters
What is in there
0Paste anything above and the panel fills in as you type.
Load a sample paste and watch the panel fill in
Next step
If the text you just cleaned came out of a markdown file, the headings and bold markers are a formatting problem rather than a character problem, and there is a converter for that. If you are cleaning text because you are worried how it reads, the writing itself is the thing to work on.
What people mean when they say remove ChatGPT formatting
Two different complaints share the phrase. One is about things you can see: heading hashes that arrived as literal ## characters, bold markers sitting in the middle of a sentence as **, bullet glyphs that will not line up with the rest of a document. That is a formatting problem, and it is annoying but obvious.
The other is about things you cannot see. A no-break space where a normal space should be. A zero width character wedged between two letters. A Cyrillic а standing in for a Latin a. Nothing looks wrong. Your search still fails, your import still rejects the row, and you spend twenty minutes staring at two strings that are identical on screen.
Most tools that offer to remove ChatGPT formatting handle both, then hand you a clean block and leave. The part that is missing is the diagnosis. If a tool quietly deleted eleven characters from your text, you would want to know which eleven, and whether any of them were doing a job. That is what the panel above is for, and it is why the detection runs before the cleaning rather than as a footnote to it.
The characters it looks for, and where each one comes from
This is a partial list, chosen because these are the ones that reach people through copy and paste. The tool checks more than this, and the panel above names whatever it finds by its official Unicode name rather than a category label.
| Codepoint | Name | How it reaches you | What it breaks |
|---|---|---|---|
| U+200B | ZERO WIDTH SPACE | Web pages using it as a line break opportunity, and filter evasion | String equality, search, word counts |
| U+200C | ZERO WIDTH NON-JOINER | Persian and Indic text, and copy from rich editors | Nothing, when it is doing its job. Removing it damages those scripts |
| U+200D | ZERO WIDTH JOINER | Emoji sequences, and stray pastes from chat interfaces | Nothing inside an emoji. Stripping it splits one glyph into several |
| U+FEFF | ZERO WIDTH NO-BREAK SPACE | A byte order mark left at the front of a file or a copied block | JSON parsing, CSV headers, the first line of almost anything |
| U+00AD | SOFT HYPHEN | Justified text in word processors and PDF extraction | Search, because the word is split where you cannot see a split |
| U+00A0 | NO-BREAK SPACE | Word processors keeping a number beside its unit | Trimming, splitting on whitespace, CSS selectors, variable names |
| U+202F | NARROW NO-BREAK SPACE | Reported in chat model output in place of an ordinary space | Rendering, in apps that draw it at a fifth of normal width |
| U+2007 | FIGURE SPACE | PDF readers padding numeric columns to line up | Anything that splits a table row on a plain space |
Codepoints and names checked against the Unicode articles for the zero width space, the non-breaking space and the word joiner. The narrow no-break space row describes a user report on the OpenAI developer forum of U+202F appearing in place of ordinary spaces. That thread has no official reply on it, so treat it as a reproducible community observation rather than a documented behaviour.
Where hidden characters do actual damage
The consistent theme is silent failure. A visible bug announces itself. These do not. An HTML class attribute splits into separate class names on ASCII whitespace, and U+00A0 is not ASCII whitespace, so class="btn primary" with a no-break space in the middle becomes one class name that neither .btn nor .primary will match. No error is raised anywhere. A byte order mark at the head of a file is similar: JSON.parse throws on it at position zero, and the message quotes the opening brace rather than the character sitting in front of it.
Code review is the worst of it. GitLab has an open issue titled Highlight zero-width space changes, which opens with the observation that in a diff, one cannot see that a line includes a zero-width space change, and that as these spaces can break things they should be highlighted. A reviewer sees a line marked as changed and no change in it.
Outside code, it shows up as search that finds nothing. A soft hyphen inside a product name splits it invisibly, so a support agent searching for the name gets no results while looking straight at it. Spreadsheet imports do something similar with figure spaces from PDF tables, where a column split on whitespace produces one long cell.
None of this is dramatic. It is a category of bug that costs an hour at a time and never leaves a trace worth writing up, which is why so few people go looking until it has happened to them twice. It is also the honest reason to remove ChatGPT formatting from anything headed for a database, a config file or a pull request.
Why a cleaner needs guards, and what happens without them
A naive cleaner is a search and replace over a list of codepoints, and it will damage real text within about a minute of use. Three cases matter enough that this tool refuses the obvious behaviour.
The first is emoji. A family glyph is several emoji held together by U+200D, the zero width joiner. Strip every joiner and one picture becomes four. So the joiner is only removed when it is not sitting between two emoji.
The second is Arabic and Indic script, where U+200C controls whether adjacent letters connect. It is not an artifact there, it is spelling. The same check applies: a joiner next to those scripts stays where it is.
The third is the lookalike letters, and this one is the easiest to get wrong. A Cyrillic о inside the English word confidential is almost certainly a problem. The identical character inside a Russian word is the correct letter, and converting it produces nonsense. So the tool reads the whole word first: it substitutes only when the word already contains ASCII Latin letters and contains no Cyrillic or Greek letter that lacks a Latin lookalike. Genuine Russian and Greek pass through untouched, and you can confirm that with the sample pastes above.
The lookalike mappings follow the confusable character data described in UTS #39, Unicode Security Mechanisms. The word level guard is ours, not part of that specification.
What cleaning will not do for you
It is not a way to change what an AI detector says about your writing. Those tools score the text itself: vocabulary, sentence length variation, how predictable the next word is. Punctuation is a small input at best. Replacing every em dash leaves the sentences saying the same thing in the same order, which is the part being measured, so treat any score movement as noise rather than progress.
It also will not fix writing that sounds like a template. If the reason you are here is that a draft reads as though nobody wrote it, the fix is in the sentences rather than the characters. Wanting to remove ChatGPT formatting and wanting to sound less like a chatbot are two different jobs, and this tool only does the first one.
And it cannot tell you where a character came from. A no-break space is a no-break space whether a word processor, a chat model or a web page put it there. Anyone claiming to identify the source of a hidden character from the character alone is guessing.
How this tool works
Detection and cleaning share one code path, which is the whole design. Ask it to remove ChatGPT formatting and the scanner first produces a list of edits against your original text, each with an offset, a length and a replacement, and the cleaned output is that list applied in order. The count in the panel is therefore the number of edits your text received, not a separate tally that could drift away from reality.
Overlaps are resolved rather than ignored. Two rules can want the same offsets, so the passes run in a fixed order and the first rule to claim a span keeps it. Everything downstream depends on that, because the moment two edits touch the same range, the count in the panel stops describing the output.
The em dash is the only character whose replacement depends on context. Replacing one — two with a bare hyphen would leave a space either side of it, so the rule looks at what is already there and supplies only the spacing that is missing. At the start of a line it becomes a list marker instead, because that is what it was being used as.
The scan runs on every keystroke against a deferred copy of your text, so typing stays responsive on long pastes, and the inline preview stops rendering above twenty thousand characters while the counts and the output continue to cover everything.
A test suite covers the behaviour described here. It checks that cleaning twice gives the same result as cleaning once, that fixtures containing CJK, emoji, accented Latin, Arabic and Russian come through with every visible character intact, that switching a pass off leaves its characters alone, and that the findings the panel reports are exactly the edits the output received. That is fixture coverage rather than a proof over all possible text, and two of those tests exist because an adversarial review of the first version found the cleaner deleting an em dash at the end of a line.
Frequently asked questions
How do I remove hidden characters from ChatGPT text?
Paste it into the box above. The panel lists every hidden character it found with its codepoint and its position in your text, and the cleaned copy appears beside the original. Nothing is uploaded, so you can do this with a draft you would not want sitting on a server you do not control. If you would rather remove ChatGPT formatting by hand, a plain text editor set to show invisible characters will reveal them, but you then have to delete each one yourself and there is no count to check your work against.
Why does my pasted text have weird spaces in it?
Because not every space is U+0020. Word processors commonly insert U+00A0 no-break space to keep a number next to its unit. PDF extraction often produces U+2007 figure space where a table was padded to line up. And U+202F narrow no-break space has been reported turning up in chat model output in place of ordinary spaces, rendering at roughly a fifth of normal width. They all look close enough to a space to pass a glance, and none of them are equal to one when software compares strings.
Do em dashes really give away AI writing?
It is the pattern people point at most often, and the reason is that chat output tends to use them more heavily than most human drafts do. That is a habit rather than a watermark. Swapping every em dash for a hyphen does not make a piece of writing read as human, and punctuation is not what detection tools are built around, so do not expect a score to move. Change the dashes because plain ASCII survives forms, code and old software better, and leave it at that.
What is the zero width space and why is it in my text?
U+200B ZERO WIDTH SPACE is a character with no visible width, used legitimately to mark where a long word may break across lines. It arrives in pasted text from web pages that use it for line breaking, from editors that insert it as a placeholder, and from anyone deliberately breaking up a word to slip past a filter. It counts as a character everywhere it matters, so a string with one in the middle will not match the same string without it.
Will removing invisible characters get past an AI detector?
You should not count on it. Detection tools work on statistical properties of the writing, so stripping characters that carry no meaning is not the lever people hope it is. Hidden characters are a separate problem with separate symptoms: searches that find nothing, string comparisons that fail, imports that reject a row, diffs that mark a line as changed when you can see no change. Clean them because they break software.
Is it safe to paste confidential text into an online cleaner?
It depends entirely on whether the tool sends your text anywhere, and most pages that claim to be private do not give you a way to check. This one does the work in the page itself with no request of any kind, which you can confirm by opening your browser network tab, pasting some text, and watching nothing happen. For anything genuinely sensitive, that check is worth thirty seconds of your time on any tool, including this one.
Why does my code break when I paste it from a chat window?
Usually a non-breaking space or a zero width space landed inside an identifier or a string literal. The compiler sees a different character from the one you see, so a name that looks correct does not resolve and a comparison that looks true is false. It is worse in review, because a diff shows a changed line with no visible difference. GitLab has an open issue asking for exactly this to be highlighted, which tells you how often it bites people.
Related tools on OpenAI Tools Hub
Markdown to Plain Text Converter
For when the problem is headings and link syntax rather than hidden characters.
Text Diff
Compare the original and the cleaned copy line by line to see exactly what moved.
Word Counter
Character counts that change once the invisible characters are gone.
Token Counter
Stray characters cost tokens. Count them before you pay for them.
Context Window Calculator
Check how much of a cleaned document fits in one model context.
Free AI Writing Tools Compared
The tools whose output ends up in this cleaner, rated on what they are good at.
About the author
Jim Liu
Jim Liu runs the OpenAI Tools Hub review portfolio. He started trying to remove ChatGPT formatting properly after losing an afternoon to a config key that had a no-break space in it, which every editor rendered as an ordinary space and no error message mentioned. More about how this site tests things.