Invisible characters in text
Guide · 14 August 2026
What they are
Unicode contains characters whose job is not to be seen. They exist for good reasons — joining scripts that need it, marking direction in mixed-language text, telling a typesetter where a word may break. The trouble starts when they end up somewhere they were never meant to be.
The families worth knowing about:
- Zero-width characters. Zero-width space (U+200B), zero-width non-joiner (U+200C), zero-width joiner (U+200D), word joiner (U+2060) and the byte-order mark (U+FEFF) when it appears mid-text. They occupy no width and leave no gap.
- Unusual spaces. Non-breaking space (U+00A0), narrow no-break space (U+202F), and the typographic spaces from U+2000 to U+200A. These look exactly like an ordinary space and are a different character entirely.
- Direction controls. Left-to-right and right-to-left marks (U+200E, U+200F), embeddings and overrides (U+202A to U+202E) and isolates (U+2066 to U+2069). These can make text display in an order different from the order in which it is stored.
- Soft hyphen (U+00AD), a break hint that only appears if the line happens to wrap there — and stays in the text when it does not.
- Variation selectors and tag characters (U+FE00 to U+FE0F, and the U+E0000 block). The tag block in particular can encode a whole readable sentence that renders as nothing at all.
Where they come from
Almost never from you typing them. They arrive by transport:
- Copying out of a word processor or a PDF, which uses no-break spaces and soft hyphens for layout, and hands them over with the text.
- Copying out of a web page, where zero-width spaces are a common trick for controlling where long strings wrap.
- Language-model output. Text produced by an AI assistant is assembled from pieces, and depending on the tool and the path it took to your clipboard, it can arrive carrying zero-width characters, no-break spaces or typographic spacing you never asked for.
- Anything that has been through several systems. Each hop is an opportunity for a normalisation step to add or fail to remove one.
What they actually break
This is not a cosmetic issue. Invisible characters are a frequent cause of bugs that look impossible:
- Search stops working. Two strings that look identical on screen are different strings, so a search, a filter or a lookup silently returns nothing.
- Comparisons fail. A password field, a coupon code, an email address or a licence key that carries a stray zero-width space is rejected as wrong, with no way for the user to see why.
- Data imports go sideways. A CSV column with a no-break space where a space belongs will not match anything downstream.
- Instructions can hide inside ordinary text. Because tag characters can encode readable sentences that render as nothing, a paragraph you paste into an AI assistant can contain wording you never saw. Whether a given system acts on it depends on that system — but you cannot make an informed decision about text you cannot fully see.
How to see them
The one thing that works is to list them explicitly. QuietMeta's text cleaner shows every invisible character it finds with its code point, its official name, how many times it occurs and where, plus a marked-up preview in which each one becomes visible. You then choose which classes to remove: zero-width characters, unusual spaces, direction controls, and optionally the conversion of typographic quotes and dashes back to plain ASCII.
It reports exactly how many characters were removed and the difference in bytes, so the result is checkable rather than a matter of trust.
One thing this does not do
Removing invisible characters changes the characters in your text. It says nothing about who or what wrote that text, and it is not a way to change how any classifier judges it. Systems that estimate whether text was machine-written work on style and structure, not on hidden characters, and independent testing puts their accuracy well below what their marketing claims. We will not pretend otherwise, and you should be suspicious of any tool that does.
Cleaning text inside files
The same work can be done to whole documents rather than pasted text: plain text formats such as .txt, .md, .json, .csv, .xml and .html, and office formats including .docx, .odt, .xlsx, .ods, .pptx and .odp — one at a time or in batches, in the desktop application. Legacy .doc, .pdf and .rtf are refused explicitly rather than handled badly, and the tool tells you why.
Clean some text Get the desktop app