TWO LAYERS, NOT ONE

Claude hidden characters vs the watermark, code point by code point

Zero width spaces and lookalike letters are real characters you can find and delete. The Claude watermark isn't a character at all. Here's how to tell them apart.

Scan my text free Updated

Short answer

They're two separate layers. Anthropic says its watermark adds nothing to the text and uses no hidden characters; it lives in which words Claude picks. Hidden characters like U+200B or U+202F are real code points you can find with a scan and remove with find and replace, and removing them leaves the watermark where it was.

THE CHARACTER LIST

What hidden characters can show up in AI text?

These are the invisible and lookalike code points a scan looks for. None of them is the Claude watermark.

X-RAY A PARAGRAPH

Seven characters you cannot see in this text

The paragraph below holds real invisible and lookalike characters. Switch on x-ray, then tap one to inspect it.

As it looks on screen

Our cafe opens at 7 am. Order ahead in the app​ and skip the line. Pastries are baked fresh every morn­ing, and the cold brew is made in smаll batches. Family packs 👨‍👩‍👧 feed four. Prices include tax and tip.

Copy the paragraph with x-ray off and the characters come with it. The emoji family is three emoji glued by two ZWJs.

Inspector

U+202F

NARROW NO-BREAK SPACE

NNBSP

UTF-8 bytes

e280af

ClaudeClean

Replaced with a space

Invisible and lookalike Unicode characters that can appear in AI text
Code pointUnicode nameWhat it doesClaudeClean
U+200BZERO WIDTH SPACEZWSPInvisible word separation and line break control, with no width.Deleted
U+200CZERO WIDTH NON-JOINERZWNJStops two letters from joining. Needed in Persian and some Indic scripts.Deleted, mind the script
U+200DZERO WIDTH JOINERZWJJoins characters. It glues emoji ZWJ sequences like family emoji together.Deleted, can split emoji
U+200E, U+200FLEFT-TO-RIGHT and RIGHT-TO-LEFT MARKLRM, RLMInvisible direction hints for mixed Latin and Arabic or Hebrew text.Deleted
U+2060WORD JOINERWJA zero width non-breaking space, the preferred way to say 'don't break here'.Deleted
U+FEFFZERO WIDTH NO-BREAK SPACEBOMA byte order mark at the start of a data stream. Mid-text, it's leftover junk.Deleted
U+00ADSOFT HYPHENSHYAn invisible marker for a possible hyphenation spot.Deleted
U+00A0NO-BREAK SPACENBSPLooks like a space, stops a line break between two words.Replaced with a space
U+202FNARROW NO-BREAK SPACENNBSPA thin no-break space. Reported in some o3 and o4-mini answers in 2025.Replaced with a space
U+2007FIGURE SPACEA no-break space as wide as a digit, used to align numbers.Replaced with a space
U+202A to U+202E, U+2066 to U+2069BIDI EMBEDDING, OVERRIDE AND ISOLATE CONTROLSChange the order text is displayed in without changing the stored order.Deleted
U+FE00 to U+FE0FVARIATION SELECTORSVS1 to VS16Pick a glyph variant. VS16 asks for the emoji style of a symbol.Deleted, can change emoji
U+0430, U+0435, U+043E, U+0440, U+0441CYRILLIC а, е, о, р, сHomoglyphsLook identical to Latin a, e, o, p, c but are different letters.Swapped to Latin inside Latin words

U+200B

ZERO WIDTH SPACE ZWSP

Invisible word separation and line break control, with no width.

ClaudeClean: Deleted

U+200C

ZERO WIDTH NON-JOINER ZWNJ

Stops two letters from joining. Needed in Persian and some Indic scripts.

ClaudeClean: Deleted, mind the script

U+200D

ZERO WIDTH JOINER ZWJ

Joins characters. It glues emoji ZWJ sequences like family emoji together.

ClaudeClean: Deleted, can split emoji

U+200E, U+200F

LEFT-TO-RIGHT and RIGHT-TO-LEFT MARK LRM, RLM

Invisible direction hints for mixed Latin and Arabic or Hebrew text.

ClaudeClean: Deleted

U+2060

WORD JOINER WJ

A zero width non-breaking space, the preferred way to say 'don't break here'.

ClaudeClean: Deleted

U+FEFF

ZERO WIDTH NO-BREAK SPACE BOM

A byte order mark at the start of a data stream. Mid-text, it's leftover junk.

ClaudeClean: Deleted

U+00AD

SOFT HYPHEN SHY

An invisible marker for a possible hyphenation spot.

ClaudeClean: Deleted

U+00A0

NO-BREAK SPACE NBSP

Looks like a space, stops a line break between two words.

ClaudeClean: Replaced with a space

U+202F

NARROW NO-BREAK SPACE NNBSP

A thin no-break space. Reported in some o3 and o4-mini answers in 2025.

ClaudeClean: Replaced with a space

U+2007

FIGURE SPACE

A no-break space as wide as a digit, used to align numbers.

ClaudeClean: Replaced with a space

U+202A to U+202E, U+2066 to U+2069

BIDI EMBEDDING, OVERRIDE AND ISOLATE CONTROLS

Change the order text is displayed in without changing the stored order.

ClaudeClean: Deleted

U+FE00 to U+FE0F

VARIATION SELECTORS VS1 to VS16

Pick a glyph variant. VS16 asks for the emoji style of a symbol.

ClaudeClean: Deleted, can change emoji

U+0430, U+0435, U+043E, U+0440, U+0441

CYRILLIC а, е, о, р, с Homoglyphs

Look identical to Latin a, e, o, p, c but are different letters.

ClaudeClean: Swapped to Latin inside Latin words

Names and abbreviations from the Unicode code charts. The ClaudeClean column describes what the cleaner does by default; it also catches any other format or control character, while keeping tabs and line breaks.

The definitions come from the Unicode General Punctuation chart and the Latin-1 Supplement chart. The BOM entry follows the Unicode BOM FAQ, which says U+2060 WORD JOINER is strongly preferred over ZWNBSP for word joining.

Lookalike letters are tracked in Unicode's UTS #39 confusables data. Cyrillic а is U+0430, not Latin a at U+0061, even though most fonts draw them the same.

SIDE BY SIDE

Is the Claude watermark a hidden character?

No. Here is how the character layer and the statistical layer differ on every point that matters.

Hidden Unicode characters compared with the Claude statistical watermark
QuestionHidden charactersClaude watermark
What is it?Extra code points stored in the stringA pattern in which words Claude chose
Can you see it?Not on screen, but code, hex views and scanners show itNo, and no tool you can run shows it
Who can detect it?Anyone, with an editor or a scannerOnly Anthropic's key, via a private-preview API
Does copy and paste keep it?Usually, though some apps normalize spacesYes, it travels with the words
How do you remove it?Find and replace, or a cleanerOnly by changing the words; Anthropic says a full rewrite does it
Does it identify you?NoNo, Anthropic says it carries no identifying information

Swipe to compare →

What is it?

Hidden characters
Extra code points stored in the string
Claude watermark
A pattern in which words Claude chose

Can you see it?

Hidden characters
Not on screen, but code, hex views and scanners show it
Claude watermark
No, and no tool you can run shows it

Who can detect it?

Hidden characters
Anyone, with an editor or a scanner
Claude watermark
Only Anthropic's key, via a private-preview API

Does copy and paste keep it?

Hidden characters
Usually, though some apps normalize spaces
Claude watermark
Yes, it travels with the words

How do you remove it?

Hidden characters
Find and replace, or a cleaner
Claude watermark
Only by changing the words; Anthropic says a full rewrite does it

Does it identify you?

Hidden characters
No
Claude watermark
No, Anthropic says it carries no identifying information

Claude watermark details from Anthropic's explainer. Hidden character behavior from the Unicode charts and the scanner rules described on this page.

SKIP THE REGEX

Every code point in that table, flagged in one paste.

ClaudeClean scans for zero width characters, odd spaces, bidi controls, variation selectors and Cyrillic or Greek lookalikes, then cleans them, all in your browser.

  • 300 rewrite credits a month
  • 20,000 characters per request
  • .txt, .docx and .pdf files

THE O3 EPISODE

Do ChatGPT hidden characters work like a watermark?

This is where the confusion started. A 2025 discovery about spaces got called a watermark long before any lab shipped one.

In April 2025, the startup Rumi reported that answers from OpenAI's o3 and o4-mini contained U+202F narrow no-break spaces, mostly in long responses and not in GPT-4o, according to Trending Topics. OpenAI made no public announcement, but Rumi later wrote that OpenAI told it the characters were not an intentional watermark.

Those spaces were visible in editors like VS Code and Sublime, and a find and replace took them out. That's the defining trait of the character layer: anyone can see it and anyone can clean it.

OpenAI's real text watermark arrived on October 5, 2026. Per BleepingComputer, textGrain is a statistical signal in word choice with no hidden characters, invisible spaces or unusual punctuation.

Don't treat odd spaces as proof

A U+202F in a document is not evidence that an AI wrote it. French typesetting, word processors, PDFs and web pages all produce no-break spaces of their own.

Going the other way, a clean string proves nothing either. Both Anthropic and OpenAI now mark text through word choice, which a character scan can't see. For the side-by-side, read ChatGPT vs Claude watermark.

APRIL 2025, REENACTED

Visible to an editor, gone after one replace

Illustration

Sample answer written for this page. The character is real: U+202F, as Rumi reported in o3 and o4-mini output.

DO IT BY HAND

How to find hidden characters in AI text yourself

Six steps from a quick editor check down to raw bytes. You only need the first two for most documents.

  1. 01

    Open the text in VS Code as code

    VS Code 1.63 and later highlight uncommon invisible characters in source code by default, but Markdown isn't highlighted by default. Paste into a new file and set the language mode to a code language like JavaScript.
  2. 02

    Search with a regular expression

    Open Find, switch on regex mode and search for [\u00A0\u00AD\u2007\u200B-\u200F\u202A-\u202F\u2060\u2066-\u2069\uFE00-\uFE0F\uFEFF]. Every match is a character from the table above.
  3. 03

    Confirm it in a hex view

    Run xxd or hexdump -C on the saved file. In UTF-8, ZWSP shows as e2 80 8b, NBSP as c2 a0, NNBSP as e2 80 af, a soft hyphen as c2 ad and a BOM as ef bb bf.
  4. 04

    List code points in a browser console

    Paste the text into a variable and map each regex match to its code point with codePointAt(0).toString(16). You get a list like U+200B, U+00A0, U+202F.
  5. 05

    Decide replace or delete per character

    Swap no-break spaces for normal spaces, delete zero width spaces and soft hyphens, and leave joiners alone inside emoji or non-Latin scripts.
  6. 06

    Or let a scanner do all five

    ClaudeClean runs the same checks in your browser, flags lookalike Cyrillic and Greek letters too, and applies those replace or delete rules for you.

Browser console snippet

const re = /[\u00A0\u00AD\u2007\u200B-\u200F\u202A-\u202F\u2060\u2066-\u2069\uFE00-\uFE0F\uFEFF]/g;
[...text.matchAll(re)].map((m) => "U+" + m[0].codePointAt(0).toString(16).toUpperCase().padStart(4, "0"));

Run on "Hello", ZWSP, "world", NBSP, "and", NNBSP, "more", it returns U+200B, U+00A0 and U+202F. It doesn't cover lookalike letters, which need a confusables map.

STEPS 3 AND 4, RUN FOR REAL

What the hidden characters look like in bytes

The example from the snippet below, saved to a file and dumped with xxd. Highlighted bytes are the invisible characters.

U+200BZWSPe2808bZERO WIDTH SPACE
U+00A0NBSPc2a0NO-BREAK SPACE
U+202FNNBSPe280afNARROW NO-BREAK SPACE
U+00ADSHYc2adSOFT HYPHEN
U+FEFFBOMefbbbfZERO WIDTH NO-BREAK SPACE

THE FAST WAY

An invisible character remover that shows its work

Paste once and see each hidden code point before anything is deleted.

01

> source text

Drop in the text

Paste it or load a .txt, .docx or .pdf. Anonymous scans take up to 2,000 characters and the scan never leaves your browser.

02

scan report

3 zero-width1 soft hyphencleanable signals2

Read the code point report

Zero width characters, odd spaces, soft hyphens, bidi controls, variation selectors and lookalike letters each get counted.

03

before → after

clearusefulanswer

Copied ✓

Clean, then rewrite if needed

Cleaning handles the character layer. For the word-choice layer, an optional rewrite runs through a non-Claude model with a diff.

PRICING

Clean the text free. Rewrite more with Pro.

The scan and hidden-character cleanup are free. Pro adds room for rewrites and files.

PRO

CLAUDECLEAN PRO

ClaudeClean Pro

$5/ month

Cancel anytime.

  • 300 credits every month (≈300,000 characters of rewriting)
  • 20,000 characters per request
  • Clean .txt, .docx and .pdf files
  • Light / medium / strong intensity
  • Dashboard with history
Checking account…

Free: 10 credits a month with an account, or try 2,000 characters right here without one. Strong rewrites cost 2× credits.

BEFORE YOU DELETE

Which invisible characters are safe to remove?

In plain English prose, nearly all of them. A few carry real meaning in other contexts.

Safe to strip in prose

  • ZWSP, WJ and soft hyphens. They only hint at line breaks and hyphenation.
  • A BOM mid-text. The Unicode FAQ defines it as a marker at the beginning of a data stream.
  • Bidi controls in English. Latin-only text has nothing for them to reorder.
  • NBSP and NNBSP. Replace them with a normal space so words don't run together.
  • Lookalikes inside Latin words. A Cyrillic о in an English word is almost never intended.

Think before stripping

  • ZWJ in emoji. Unicode's ZWJ sequences build single emoji from several, and removing it splits them.
  • VS16 after symbols. Without it, some symbols fall back to their plain text style.
  • ZWNJ in Persian or Indic text. It controls whether letters join, which changes how words read.
  • LRM and RLM in Arabic or Hebrew. They keep punctuation and numbers in the right spot.
  • Real Cyrillic or Greek words. ClaudeClean leaves words with no Latin letters alone for this reason.

LOOKALIKE LETTERS, MAGNIFIED

Same shape, different letter

Pick a pair. The lens reads each letter's code point, and only the Cyrillic one lights up.

The word on screen

Inside a Latin word spaceSwapped to Latin a, U+0061
A real Russian wordдомLeft alone: no Latin letters
LatinaU+0061LATIN SMALL LETTER A61
CyrillicаU+0430CYRILLIC SMALL LETTER Ad0b0

Most fonts draw both the same. The bytes differ: one byte for the Latin letter, two for the Cyrillic one in UTF-8.

THE KEY POINT

Does removing hidden characters remove the Claude watermark?

No. Cleaning the character layer and changing the word-choice layer are separate jobs.

Anthropic's explainer says nothing is added to the text and there are no hidden characters. There's nothing in the character layer for a cleaner to find.

The watermark only changes when the words change. Anthropic says light editing probably won't remove it, while a full rewrite that replaces every word will.

A cleaner still earns its place. Stray NBSPs break search and word counts, lookalike letters break spell check, and bidi controls can scramble how text displays.

What ClaudeClean does and doesn't do

It removes or normalizes the characters in the table above, in your browser. Its optional rewrite changes wording through a non-Claude model and shows a diff.

It can't read any provider's watermark, and rewriting is best effort. No detector result is promised. For the editing side, see does paraphrasing remove the Claude watermark.

TWO SHEETS, TWO JOBS

A cleaner reaches the top sheet only

Hidden characters sit on top of the text. The watermark is the text. Try both buttons.

Illustration
Top sheet: characters

Quarterly revenueNBSP grew steadilyZWSP across everySHY region.

Bottom sheet: word choice

Quarterlyrevenuegrewsteadilyacrosseveryregion.

Hidden characters3 foundAny scanner sees them. Find and replace removes them.
Claude word choicesStill thereAnthropic says a full rewrite that replaces every word removes the watermark. Light edits probably won't.

Sample sentence written for this page. Tinting marks Claude's word choices for illustration; nobody outside Anthropic can see the real signal.

ZWSP, UP CLOSE

What is a zero width space used for?

U+200B has real jobs outside AI text. Here's what it does, how to type one and how to find one.

PURPOSE

Invisible break points

Unicode describes ZWSP as intended for invisible word separation and line break control. It gives a long URL or compound word a place to wrap without showing a space.

TYPING ONE

Escapes, not keystrokes

Most keyboards have no key for it. Write ​ in HTML or \u200B in JavaScript, Python or JSON strings.

FINDING ONE

Three bytes in UTF-8

A ZWSP is stored as e2 80 8b. Search for those bytes in a hex view, or for \u200B in a regex-enabled find box.

For one-click copy, typing shortcuts and removal steps in VS Code, Word and Python, see the zero width space guide. To list every hidden code point in a text, use the invisible character detector.

WHY YOU CAN'T SEE IT

Watch why a text watermark leaves no visible trace

An 18-minute explainer that starts with red and green word lists and ends at SynthID-Text.

Why You Cannot See a Watermark in AI Text by No Hype AI. A clear picture of why a statistical mark never shows up as a character

FAQ

Claude hidden characters FAQ.

Anthropic says its watermark adds nothing to the text and uses no hidden characters. If a Claude draft contains zero width or no-break spaces, treat them as a separate formatting issue and check where the text passed through.
In April 2025 a startup reported U+202F narrow no-break spaces in o3 and o4-mini output, mostly in long answers; OpenAI later told the startup they were not an intentional watermark. OpenAI's October 2026 text watermark says it uses no hidden characters.
No. The watermark lives in word choice, so deleting zero width spaces or swapping no-break spaces leaves it untouched. Only changing the words themselves affects it. No detector result is promised.
U+200B, which Unicode abbreviates ZWSP. It has no width and marks an invisible word separation or a spot where a line may break. In HTML you can write it as ​ and in JavaScript as \u200B.
Since version 1.63, VS Code highlights uncommon invisible characters in source code by default. Markdown isn't highlighted by default, and the editor.unicodeHighlight settings switch each check on or off.
Mostly, in English prose. Zero width joiners build emoji sequences, ZWNJ matters in Persian and some Indic scripts, and no-break spaces should become normal spaces instead of disappearing.