Which hidden characters show up in ChatGPT output?
Four families of characters account for nearly every "weird character" found in ChatGPT and other AI-chatbot text: special spaces, zero-width characters, smart typography, and markdown residue. They are why search can't find a phrase you can plainly see, why spellcheck flags a correctly spelled word, and why a pasted code snippet suddenly won't compile. Each has a precise Unicode identity — and knowing the code point is what turns "my text feels off" into a fixable diagnosis.
| Character | Code point(s) | What it is | Typical source |
|---|---|---|---|
| Narrow no-break space | U+202F | A thin space that forbids a line break at its position | o3/o4-mini output (April 2025); French typography |
| No-break space | U+00A0 | A normal-width space that glues neighboring words to one line | Chat interface HTML ( ), Word |
| Thin space | U+2009 | A narrower-than-normal typographic space | Rendered web pages, typeset documents |
| Zero width space | U+200B | An invisible character marking a legal line-break point | Web layout pipelines, copy-paste |
| Zero width joiner / non-joiner | U+200D / U+200C | Invisible controls for how adjacent characters join | Emoji sequences, Arabic/Indic scripts |
| Byte order mark | U+FEFF | A file-encoding marker that becomes a ghost character in text | Files, feeds, exports |
| Curly quotes | U+2018, U+2019, U+201C, U+201D | Typographic quotation marks, distinct from straight ' and " | The model's trained typographic style |
| Em dash | U+2014 | The long dash used to set off clauses | The model's trained typographic style |
Two rarer ranges deserve their own definitions, because they matter for security rather than formatting. Unicode tag characters (U+E0000–U+E007F) are an invisible duplicate of the ASCII alphabet, originally designed for language tagging and now abused to hide instructions inside ordinary-looking text. Variation selectors (U+FE00–U+FE0F) are invisible characters that modify how the preceding character renders — 256 values that can also smuggle one hidden byte apiece. Neither belongs in a chat answer.
The complete reference of every range we detect — including tag characters and variation selectors — lives in the invisible Unicode characters list.
Why does ChatGPT output contain special characters?
Four different mechanisms put them there — and only one ever looked like deliberate marking:
1. Model quirks
Days after o3 and o4-mini launched on April 16, 2025, Rumi documented U+202F characters in their longer outputs. OpenAI called it "a quirk of large-scale reinforcement learning", not a watermark, and the characters vanished within days — but the episode proved model output can carry invisible Unicode.
2. Trained typography
Wikipedia's "Signs of AI writing" guide documents LLMs' habit of curly quotes (U+2018, U+2019, U+201C, U+201D) and heavy em dash use — while cautioning these also appear in professionally typeset human text.
3. The chat window's HTML
What you copy is a rendered web page, not raw model output. No-break spaces and thin spaces used by the interface's layout ride into your clipboard — a pipeline artifact no model settings can prevent.
4. Markdown residue
ChatGPT writes markdown: **asterisks**, ## headings, backticks, and list markers. Paste into a non-markdown editor and the symbols appear literally — visible clutter that reads as "special characters" even though it's plain ASCII.
How do I see hidden characters?
The fastest way is a scanner that names every code point — like the tool at the top of this page — but every serious editor can also make them visible:
- This tool's detection report. Paste text above and get each hidden character by name, code point, and count — then optionally remove them in one click, or use the check-only watermark checker.
- Microsoft Word: Show all (Ctrl+Shift+8). The ¶ button reveals formatting marks: regular spaces appear as small raised dots, while no-break spaces appear as degree-sign-like ° circles. A line of ° marks where dots should be means special spaces. Zero-width characters get no mark at all, so Word alone can't give the full picture.
- VS Code. Set
editor.renderControlCharactersto true, then open Find (Ctrl+F), toggle regex mode, and search[\u00A0\u202F\u2009\u200B-\u200D\u2060\uFEFF]to jump through every special space and zero-width character in the file. - Command line.
grep -nP '[^\x00-\x7F]' draft.txtprints every line containing a non-ASCII character;grep -oP '\x{202F}' draft.txt | wc -lcounts U+202F occurrences; andiconv -f UTF-8 -t ASCII draft.txt > /dev/nullstops with an error at the first non-ASCII byte, confirming a file is pure ASCII when it exits silently.
Are hidden characters proof text is AI-generated?
No. Hidden characters are evidence of a text's pipeline, not its author. Word, Google Docs, PDFs, email clients, and web CMSs insert no-break spaces, soft hyphens, and zero-width characters constantly — which is why they turn up in text typed entirely by humans. Originality.ai's own testing found that the LLMs it tested did not inject invisible characters — they mostly arrive via tooling — and Wikipedia's AI-writing guide makes the same caution about curly quotes, which Chicago-style publishing has used for a century. The April 2025 U+202F episode is the exception that proves the rule: a real, documented model artifact that OpenAI removed within days.
As of August 2026, no mainstream chatbot is known to embed hidden characters deliberately. The AI text watermarks that actually exist — Google's SynthID-Text in Gemini, and the watermark Claude models carry since August 2, 2026 — are statistical, woven into word choice, and add no characters at all. So a character scan tells you about copy-paste history and hygiene; it was never going to be an AI-authorship test, in either direction.
Practical takeaway: treat a hidden character as a prompt to check where the text has been, not as a verdict. And before you publish or submit, strip the ambiguity itself — remove the invisible characters so there's nothing to misread. Hidden characters are only one of the layers that travel with AI output — what's inside AI text covers the other three.