GPT Cleanup

Invisible Unicode Characters: The Complete Reference List

Every invisible or near-invisible Unicode character worth knowing about, what it is for, and whether it is safe to remove.

What counts as an invisible character

An invisible Unicode character is a code point that renders with no visible glyph, or with a glyph so small or so similar to a regular space that it is functionally invisible to a reader. Some exist for legitimate typographic or linguistic reasons — joining letters in Arabic, marking text direction, spacing out digits. Others exist purely as technical artifacts of software, and a few are used deliberately to hide text from human readers while keeping it machine-readable. The table below covers the ones you are most likely to run into, what each is actually for, and whether it is safe to strip on sight.

Reference table

CharacterCode pointCategoryWhere it comes fromSafe to remove?
Zero Width SpaceU+200BFormattingAI chat UIs, PDFs, web copyYes
Zero Width Non-JoinerU+200CScript controlPersian, Arabic, Indic script renderingNo — required in those scripts
Zero Width JoinerU+200DScript controlEmoji sequences, Indic script renderingNo — keep inside emoji
Word JoinerU+2060FormattingRich-text editors, AI chat UIsYes
Byte Order Mark / ZWNBSPU+FEFFEncoding markerFile headers, some text exportsOnly legitimate as the first character of a file
Left-to-Right MarkU+200EBidi controlMixed-direction text, some chat UIsUsually yes, outside bidi text
Right-to-Left MarkU+200FBidi controlMixed-direction text, some chat UIsUsually yes, outside bidi text
LTR/RTL Embedding & OverrideU+202A–U+202EBidi controlLegitimate bidi text; also "Trojan Source" code attacksFlag and inspect — security risk
Bidi IsolatesU+2066–U+2069Bidi controlModern bidi-aware text renderingUsually yes, outside bidi text
Soft HyphenU+00ADTypographyPDFs and web pages at line-wrap pointsYes
No-Break SpaceU+00A0SpacingWeb pages, word processors, AI chat UIsYes — convert to a regular space
Narrow No-Break SpaceU+202FSpacingFrench typography, some localesCase by case
Figure / Thin / Hair SpaceU+2007, U+2009, U+200ASpacingTypeset documents, number alignmentCase by case
Ideographic SpaceU+3000SpacingCJK text and full-width inputNo — required spacing in CJK
Mongolian Vowel SeparatorU+180EScript controlMongolian script textNo — required in that script
Invisible Separator / Times / PlusU+2062–U+2064Math markupMathML and technical publishing exportsYes, outside math content
Hangul FillerU+3164Script controlKorean input method placeholdersCase by case
Variation SelectorsU+FE0E / U+FE0FPresentation controlEmoji vs. text presentation switchingNo — required for emoji presentation
Tag CharactersU+E0000–U+E007FDeprecated taggingFlag emoji; also abused for "ASCII smuggling"Flag and inspect — security risk
Private Use AreaU+E000–U+F8FFApplication-definedIcon fonts, app-specific glyphsCase by case

How they get into text

Most invisible characters arrive as a byproduct rather than by intent. AI chat interfaces (ChatGPT, Claude, Gemini) use zero-width characters internally for cursor tracking and streaming, and these leak into copied output. Rich-text editors like Word, Google Docs, and Notion embed formatting metadata as invisible characters. PDF-to-text extraction routinely inserts non-breaking spaces and soft hyphens at line-wrap boundaries. Copying from a web page pulls in whatever non-breaking spaces and joiners the page's CSS and markup relied on for layout. A smaller set — bidi overrides and tag characters — can also be inserted deliberately, either to obscure text from a casual reader or, in security contexts, to smuggle instructions past a filter that only checks visible content.

Why they matter

For search and text matching, an invisible character splits what looks like one word into two tokens, or makes two visually identical strings fail an equality check. For code, they produce syntax errors and reference errors that are nearly impossible to spot by reading the source. For data, they break deduplication, VLOOKUP-style matching, and database joins on values that display as identical. For security, bidi override characters (U+202A–U+202E) can reorder how a line of code displays without changing what it executes — this is the basis of "Trojan Source" attacks — and tag characters (U+E0000–U+E007F) can encode hidden text inside what looks like a single emoji, a technique used in prompt-injection attempts against AI systems.

How to detect them

The raw view on our tools labels every hidden character it finds with its code point, so you see exactly what is in a string instead of guessing. Outside of that, a regex character class targeting specific code points (for example /[\u200B\u200C\u200D\uFEFF]/g in JavaScript) finds them programmatically, and most modern code editors — VS Code in particular — have a Unicode highlighting setting that flags unusual characters as you type.

What GPT Cleanup removes, and what it leaves alone

To be precise about scope: GPT Cleanup removes U+200B, U+200C, U+200D (except inside emoji sequences, where it is kept), U+2060, U+FEFF, U+200E, U+200F, and U+00AD, and it converts U+00A0 to a regular space. It does not currently touch the bidi override and isolate characters (U+202A–U+202E, U+2066–U+2069), the narrow and specialty spaces (U+202F, U+2007–U+200A), the ideographic space (U+3000), the Hangul filler (U+3164), tag characters, or private-use characters. If you are specifically checking for the security-relevant categories — bidi overrides or tag characters — you need to look for them separately; this list is meant to make that easy to do by hand or with a regex.

For a hands-on comparison across the common set, our zero-width space remover strips the categories listed as removable above, and our AI detector scans and reports on the full set found in a given piece of text. For background on why AI chat interfaces specifically leave these characters behind, see our companion post on zero-width characters.