Skip to main content

Still paying full price for ChatGPT Plus, Claude & Gemini?

Split the exact same subscriptions with GamsGo and cut your monthly AI bill by up to 80%, same accounts, a fraction of the cost.

See how much you save →
Sponsored
Back to Tools

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

0

Paste anything above and the panel fills in as you type.

Cleaning passes

Replace an em dash with

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.

CodepointNameHow it reaches youWhat it breaks
U+200BZERO WIDTH SPACEWeb pages using it as a line break opportunity, and filter evasionString equality, search, word counts
U+200CZERO WIDTH NON-JOINERPersian and Indic text, and copy from rich editorsNothing, when it is doing its job. Removing it damages those scripts
U+200DZERO WIDTH JOINEREmoji sequences, and stray pastes from chat interfacesNothing inside an emoji. Stripping it splits one glyph into several
U+FEFFZERO WIDTH NO-BREAK SPACEA byte order mark left at the front of a file or a copied blockJSON parsing, CSV headers, the first line of almost anything
U+00ADSOFT HYPHENJustified text in word processors and PDF extractionSearch, because the word is split where you cannot see a split
U+00A0NO-BREAK SPACEWord processors keeping a number beside its unitTrimming, splitting on whitespace, CSS selectors, variable names
U+202FNARROW NO-BREAK SPACEReported in chat model output in place of an ordinary spaceRendering, in apps that draw it at a fifth of normal width
U+2007FIGURE SPACEPDF readers padding numeric columns to line upAnything 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.

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.

Sponsored

Ad served by Adsterra. OpenAIToolsHub is not responsible for advertiser content.