Zero-Width & Invisible Characters
Not all Unicode characters have visible glyphs. This page catalogs the characters that affect text rendering, layout, and direction without rendering any visible mark themselves. They are the most common source of subtle bugs: string comparisons that fail, lengths that don't match, copy-paste that silently inserts hidden characters, and bidirectional text that renders incorrectly.
Each entry below links to the character's full detail page where you can see its UTF-8 bytes, HTML entity, JavaScript escape, and other encoding formats — useful for detecting and removing these characters from user input.
Complete Reference
| Codepoint | Name |
|---|---|
| U+0009 | <control> |
| U+00A0 | No-break Space |
| U+00AD | Soft Hyphen |
| U+034F | Combining Grapheme Joiner |
| U+061C | Arabic Letter Mark |
| U+115F | Hangul Choseong Filler |
| U+1160 | Hangul Jungseong Filler |
| U+17B4 | Khmer Vowel Inherent Aq |
| U+17B5 | Khmer Vowel Inherent Aa |
| U+180B | Mongolian Free Variation Selector One |
| U+180C | Mongolian Free Variation Selector Two |
| U+180D | Mongolian Free Variation Selector Three |
| U+180E | Mongolian Vowel Separator |
| U+2000 | En Quad |
| U+2001 | Em Quad |
| U+2002 | En Space |
| U+2003 | Em Space |
| U+2004 | Three-per-em Space |
| U+2005 | Four-per-em Space |
| U+2006 | Six-per-em Space |
| U+2007 | Figure Space |
| U+2008 | Punctuation Space |
| U+2009 | Thin Space |
| U+200A | Hair Space |
| U+200B | Zero Width Space |
| U+200C | Zero Width Non-joiner |
| U+200D | Zero Width Joiner |
| U+200E | Left-to-right Mark |
| U+200F | Right-to-left Mark |
| U+202A | Left-to-right Embedding |
| U+202B | Right-to-left Embedding |
| U+202C | Pop Directional Formatting |
| U+202D | Left-to-right Override |
| U+202E | Right-to-left Override |
| U+202F | Narrow No-break Space |
| U+205F | Medium Mathematical Space |
| U+2060 | Word Joiner |
| U+2061 | Function Application |
| U+2062 | Invisible Times |
| U+2063 | Invisible Separator |
| U+2064 | Invisible Plus |
| U+206A | Inhibit Symmetric Swapping |
| U+206B | Activate Symmetric Swapping |
| U+206C | Inhibit Arabic Form Shaping |
| U+206D | Activate Arabic Form Shaping |
| U+206E | National Digit Shapes |
| U+206F | Nominal Digit Shapes |
| U+3000 | Ideographic Space |
| U+FEFF | Zero Width No-break Space |
| U+FFA0 | Halfwidth Hangul Filler |
| U+1D159 | Musical Symbol Null Notehead |
| U+1D173 | Musical Symbol Begin Beam |
Detecting Hidden Characters
To strip zero-width characters from user input in JavaScript:
// Remove the most common invisible characters str.replace(/[\u200B-\u200D\uFEFF\u00AD\u2060]/g, '')
In Python:
import unicodedata
''.join(c for c in text if unicodedata.category(c) not in ('Cf', 'Zs') or c == ' ')