Skip to content
Ghostchars

Zero-width and invisible

NONCHARACTERS (U+FDD0–U+FDEF)

Codepoints Unicode has permanently reserved to never be characters: U+FDD0–U+FDEF plus the last two codepoints of every plane (U+FFFE, U+FFFF, U+1FFFE, and so on).

Range
U+FDD0–U+FDEF
Removed by default
Yes
Governing option
No option needed
Can be load-bearing
No

Where it comes from

Internal sentinels that leaked out of a program, corrupted encoding conversions, and fuzzing or payload tools that pick them precisely because nothing legitimate ever uses them.

Why it matters

They are guaranteed never to appear in interchange, so any occurrence is a bug or an intrusion. They also crash or confuse parsers, and because they are permanently unassigned they are not Format characters — a filter that scans for the "Cf" category misses them entirely.

Before and after

BeforeokU+FDD0
Afterok

U+FDD0, the first noncharacter — a codepoint guaranteed to mean nothing, anywhere, forever.

The character is shown as a labelled chip so you can see where it sits. In your text it draws nothing at all.

When it is legitimate

Never, in text you send anywhere. Their only sanctioned use is as a private internal sentinel inside one program.

How to remove it

The default pass removes every one of them. Ghostchars lists them explicitly rather than relying on a category test, because their category is "unassigned".

Is it an AI watermark?

Not a watermark

No. A noncharacter in your text is a sign of a broken pipeline or a deliberate probe, never of a language model.

No connection to machine-generated text. It comes from software, from a keyboard, or from a person.

Questions

Why does Unicode reserve codepoints that can never be used?

So that programs have values they can safely use internally as sentinels, knowing no real text will ever contain them.

Why do other cleaners miss them?

Most scan for the Unicode "format" category. Noncharacters are permanently unassigned, so they are not in it and have to be listed by hand.

Check your own text

Paste anything into the cleaner to see every hidden character it contains, with position, codepoint and what happens to each one. Nothing is uploaded.

Check your own textAll characters