Invisible Character Remover

Every non-printing character in your text, listed by code point and position, with a one-click clean for the ones that are safe to drop.

Local · 0 B uploaded Local · 0 B uploaded
WHAT GETS FLAGGED Last checked Aug 30, 2026
Zero-width family
U+200B, U+200C, U+200D, U+FEFF, U+2060
Invisible spacing
U+00A0, U+202F, U+205F, U+3000
Format controls
U+00AD, U+2028, U+2029
Bidi controls
U+202A to U+202E, U+2066 to U+2069
Lookalikes
Unknown: Flagged, never stripped
Functional characters
Kept unless you opt in

Not every invisible character is junk

Blanket-stripping every non-printing code point breaks real text. Variation selectors turn a glyph into an emoji. Zero-width joiners hold multi-part emoji together, so a family or a flag falls apart without them. Soft hyphens tell a renderer where a long word may break.

DetectMark separates the two groups. The default clean covers U+200B, U+00AD, and interior byte-order marks, because those are inert almost everywhere they appear. Everything else is shown, explained, and left alone until you tick it.

Lookalikes are flagged and never removed

A Cyrillic а and a Latin a are different characters that draw the same shape. Swapping one for the other silently would change the text, and there is no safe automatic direction to swap in, so lookalikes stay in the report as evidence rather than becoming an edit.

Where these characters come from

Rich-text copy is the usual source. A browser, a document editor, or a chat interface puts an HTML flavour of the selection on the clipboard, and the characters that hold that formatting together survive the trip into a plain-text field.

Models leave them occasionally too. In April 2025 OpenAI's o3 and o4-mini briefly emitted U+202F in long responses, which OpenAI described as a quirk of large-scale reinforcement learning rather than a mark, and which stopped appearing within days.

FAQ