Paste text into the Hidden Character Detector audit console to surface invisible Unicode, em-dashes, and configured AI-ish phrase patterns without sending your text off-device.
Scans zero-width characters, em-dashes, and the configured phrase list in your browser.
Concrete matches from the existing detector rules.
Our free Invisible Text Detector and Remover makes it easy to identify and remove any unicode hidden text characters.
All processing happens locally in your browser; your text never leaves your device.
LLMs like ChatGPT do inject hidden characters, but it is not for watermarking or nefarious reasons.
ChatGPT does use several Unicode "hidden" characters a lot (such as the Em Dash).
Invisible text characters can cause both security and formatting challenges.
All popular LLMs inject hidden characters, not just ChatGPT.
Discover a rich library of prompts and other powerful AI utilities from Agentic Workers to streamline your tasks and boost creativity.
Explore Agentic WorkersHidden Unicode characters, whether subtly visible (em-dashes, smart quotes, no-break spaces) or completely invisible (zero-width spaces, joiners, direction marks) are special code points that don't behave like plain ASCII. They act as a "digital ink" that reshapes how software wraps lines, splits words, parses data, or matches text, even when you don't realize they're there.
No
It has been incorrectly reported that the injection of hidden characters by ChatGPT is their attempt at "watermarking" their outputs. However, there are 2 reasons that this is very unlikely:
Yes
LLMs like ChatGPT do inject hidden characters. Many of these characters are harmless formatting characters (like the popular em-dash), while some can cause formatting issues (zero-width space).
Some of the most common Unicode characters that ChatGPT uses include:
The long dash character ChatGPT frequently inserts—especially in recent model versions (GPT-5 series, GPT-4o)—to break up sentences or add dramatic pauses.
Unicode: U+2014
Description: A long horizontal dash wider than a hyphen. Useful in typography for parenthetical breaks, but in code, CSV, or plain-text data it can act like a non-standard character, causing copy/paste or parsing issues.
Example: word—word ← visually similar to word-word, yet represents a distinct Unicode code point.
The curly "typographer's" quotation marks that ChatGPT sometimes substitutes for straight quotes.
Unicode:
Description: Curved punctuation intended for print typography. They often appear where a plain straight quote (", ') would be safer—breaking code snippets, CSV files, or Markdown.
Example: "hello" or 'world'
A completely invisible spacing character that may slip into text when copying from ChatGPT or other editors.
Unicode: U+200B
Description: Adds no visible gap but still separates characters. Can break string matching, URLs, and word counts; causes "why won't it paste correctly?" problems.
Example: wordword ← looks like one word, but a zero-width space sits between the two halves.
There are 3 reasons that likely contribute to the increased usage of invisible characters by LLMs:
Since LLMs train heavily on professionally edited texts where em dashes and smart quotes are standard, it would have learned to use them more frequently than in everyday writing.
LLMs have a bias to sounding formal/authoritative and these characters help it achieve that.
The reason we don't use these invisible characters more is because they are not on any standard keyboard (ASCII, ISO etc). LLMs don't "write" using a keyboard so it is no extra effort for them to use an invisible character compared to a human writing.
Below is a complete list of the most common invisible text characters and how our free tool handles them.
| # | Unicode | Visibility | Description | Replaced With |
|---|---|---|---|---|
| 1 | U+0020 | Visible | Regular Space | keep |
| 2 | U+00A0 | Visible | No-Break Space | → space |
| 3 | U+0009 | Visible | Tab | → 4 spaces |
| 4 | U+000A | Visible | Line Feed (LF) | keep |
| 5 | U+000C | Visible | Form Feed | remove |
| 6 | U+001C | Visible | File Separator | remove |
| 7 | U+000D | Visible | Carriage Return (CR) | remove |
| 8 | U+2000 | Visible | En Quad | → space |
| 9 | U+2001 | Visible | Em Quad | → space |
| 10 | U+2002 | Visible | En Space | → space |
| 11 | U+2003 | Visible | Em Space | → space |
| 12 | U+2004 | Visible | Three-Per-Em Space | → space |
| 13 | U+2005 | Visible | Four-Per-Em Space | → space |
| 14 | U+2006 | Visible | Six-Per-Em Space | → space |
| 15 | U+2007 | Visible | Figure Space | → space |
| 16 | U+2008 | Visible | Punctuation Space | → space |
| 17 | U+2009 | Visible | Thin Space | → space |
| 18 | U+200A | Visible | Hair Space | → space |
| 19 | U+202F | Visible | Narrow NBSP | → space |
| 20 | U+205F | Visible | Math Space | → space |
| 21 | U+3000 | Visible | Ideographic Space | → space |
| 22 | U+1680 | Visible | Ogham Space Mark | → space |
| 23 | U+200B | Invisible | Zero-Width Space | → space |
| 24 | U+200C | Invisible | Zero-Width Non-Joiner | remove |
| 25 | U+200D | Invisible | Zero-Width Joiner | remove |
| 26 | U+200E | Invisible | Left-To-Right Mark | remove |
| 27 | U+200F | Invisible | Right-To-Left Mark | remove |
| 28 | U+202A | Invisible | LTR Embedding | remove |
| 29 | U+202B | Invisible | RTL Embedding | remove |
| 30 | U+202C | Invisible | Pop Directional Fmt | remove |
| 31 | U+202D | Invisible | LTR Override | remove |
| 32 | U+202E | Invisible | RTL Override | remove |
| 33 | U+2060 | Invisible | Word Joiner | remove |
| 34 | U+2061 | Invisible | Function Application | remove |
| 35 | U+2062 | Invisible | Invisible Times | → "x" |
| 36 | U+2063 | Invisible | Invisible Separator | → "," |
| 37 | U+2064 | Invisible | Invisible Plus | → "+" |
| 38 | U+2066 | Invisible | LTR Isolate | remove |
| 39 | U+2067 | Invisible | RTL Isolate | remove |
| 40 | U+2068 | Invisible | First Strong Isolate | remove |
| 41 | U+2069 | Invisible | Pop Directional Isolate | remove |
| 42 | U+206A | Invisible | Inhibit Symmetric Swap | remove |
| 43 | U+206B | Invisible | Activate Symmetric Swap | remove |
| 44 | U+206C | Invisible | Inhibit Arabic Form Shaping | remove |
| 45 | U+206D | Invisible | Activate Arabic Form Shaping | remove |
| 46 | U+206E | Invisible | National Digit Shapes | remove |
| 47 | U+206F | Invisible | Nominal Digit Shapes | remove |
| 48 | U+2028 | Invisible | Line Separator | → \n |
| 49 | U+2029 | Invisible | Paragraph Separator | → \n\n |
| 50 | U+2014 | Visible | Em Dash | keep |
| 51 | U+2013 | Visible | En Dash | keep |
| 52 | U+2019 | Visible | Right Single Quote | → ' |
| 53 | U+201C | Visible | Left Double Quote | → " |
| 54 | U+201D | Visible | Right Double Quote | → " |
| 55 | U+2018 | Visible | Left Single Quote | → ' |
| 56 | U+2026 | Visible | Horizontal Ellipsis | → ... |
| 57 | U+00AD | Invisible | Soft Hyphen | remove |
| 58 | U+034F | Invisible | Grapheme Joiner | remove |
| 59 | U+2800 | Visible | Braille Blank | → space |
| 60 | U+3164 | Visible | Hangul Filler | → space |
| 61 | U+115F | Visible | Hangul Choseong Filler | remove |
| 62 | U+1160 | Visible | Hangul Jungseong Filler | remove |
| 63 | U+17B4 | Visible | Khmer Vowel Inherent AQ | remove |
| 64 | U+17B5 | Visible | Khmer Vowel Inherent AA | remove |
| 65 | U+180B | Invisible | Mongolian VS-1 | remove |
| 66 | U+180C | Invisible | Mongolian VS-2 | remove |
| 67 | U+180D | Invisible | Mongolian VS-3 | remove |
| 68 | U+180E | Visible | Mongolian Vowel Sep. | → space |
| 69 | U+FE00 | Invisible | Variation Selector-1 | remove |
| 70 | U+FE01 | Invisible | Variation Selector-2 | remove |
| 71 | U+FE02 | Invisible | Variation Selector-3 | remove |
| 72 | U+FE03 | Invisible | Variation Selector-4 | remove |
| 73 | U+FE04 | Invisible | Variation Selector-5 | remove |
| 74 | U+FE05 | Invisible | Variation Selector-6 | remove |
| 75 | U+FE06 | Invisible | Variation Selector-7 | remove |
| 76 | U+FE07 | Invisible | Variation Selector-8 | remove |
| 77 | U+FE08 | Invisible | Variation Selector-9 | remove |
| 78 | U+FE09 | Invisible | Variation Selector-10 | remove |
| 79 | U+FE0A | Invisible | Variation Selector-11 | remove |
| 80 | U+FE0B | Invisible | Variation Selector-12 | remove |
| 81 | U+FE0C | Invisible | Variation Selector-13 | remove |
| 82 | U+FE0D | Invisible | Variation Selector-14 | remove |
| 83 | U+FE0E | Invisible | Variation Selector-15 | remove |
| 84 | U+FE0F | Invisible | Variation Selector-16 | remove |
| 85 | U+FEFF | Invisible | Zero-Width NBSP / BOM | remove |
| 86 | U+FFA0 | Visible | Half-width Hangul Filler | → space |
| 87 | U+FFFC | Visible | Object Replacement | → "[OBJECT]" |
Scroll horizontally on mobile devices to view the full table. Invisible characters are highlighted in red, visible formatting characters in yellow.
A zero-width space (U+200B) or soft hyphen (U+00AD) lets writers nudge where a line breaks, so long words don't dangle awkwardly at the edge of a column.
Some sites forbid real spaces. Sneaking in an invisible Hangul Filler (U+3164) keeps John Doe readable while still passing the "no-space" rule.
Publishers can hide a unique pattern of zero-width marks inside an article. If the text leaks, those invisible dots act like digital fingerprints.
Looks the same, acts differently - Two snippets that appear identical may hash or sort differently once hidden characters are factored in, breaking exports, searches, or audit trails.
Attackers can bury malware or secret instructions among zero-width characters; the file compiles or runs, but a human code reviewer sees nothing unusual.
Hidden Unicode can smuggle extra instructions into a chatbot prompt, making the model reveal data or generate harmful content without the user noticing.
If text has a lot of unique formatting that is heavily used by AI (Em Dash etc) it is clear that it was AI-generated which can cause reputational harm.
Yes
Our short test below shows that the addition or removal of hidden characters did change the detectability of AI-generated content. We created 2 pieces of AI content and modified it by adding extra invisible characters, as well as stripping all Unicode characters using our free tool on this page.
The result was that the content was not detectable by most tools when invisible characters were added or removed.
Yes
We looked at the same prompt in several popular LLMs to see if Hidden Characters are common across models.
Prompt: Write a LinkedIn post about the benefits of formatting LinkedIn posts.
No model produced an Invisible Character but all relied heavily on formatting with visible Unicode characters. This includes ChatGPT 4o, Claude, Gemini, and other popular LLMs.
Example ChatGPT 4o: ChatGPT frequently uses em dashes (—) and smart quotes (" ") in its output, which are visible Unicode characters that can cause formatting issues when copying to code or plain text environments.
"After optimizing my prompts with Agentic Workers, our content creation process is 3x faster. The prompt library alone saved us countless hours of trial and error."
"The quality of AI outputs I'm getting now is night and day compared to before. Agentic Workers taught me how to structure prompts to get exactly what I need every time."
"I was skeptical about AI tools, but Agentic Workers changed my mind. Their prompt techniques have helped me build and document features in half the time."
Join thousands of professionals improving their AI workflows
Join Agentic Workers to access a suite of AI tools, an extensive prompt library, and advanced features designed to elevate your workflow.
Discover More at Agentic WorkersCommon questions about hidden characters and this detector tool