About invisible characters
Invisible characters are Unicode codepoints that render with zero width but count as text. They occupy a string position, defeat empty-input validation, and pass through copy-paste, yet display nothing on screen. The generator exposes the dozen reliable invisibles drawn from four blocks: General Punctuation (zero-width space, joiner, non-joiner), Arabic Presentation Forms (zero-width no-break space / BOM), Hangul Compatibility Jamo (Hangul Filler), and the deprecated Mongolian Vowel Separator.
How it works
The tool is a static catalog. Each entry in the catalog is a single Unicode codepoint whose Bidi class or General Category places it in the "format" or "spacing" category, meaning the renderer reserves no advance width for it. Click any entry and the page writes the codepoint to the clipboard via the Clipboard API.
// Pseudo-code: catalog selection
catalog = [
{label: "Zero-Width Space", cp: U+200B, gc: "Cf"},
{label: "Zero-Width Non-Joiner", cp: U+200C, gc: "Cf"},
{label: "Zero-Width Joiner", cp: U+200D, gc: "Cf"},
{label: "Word Joiner", cp: U+2060, gc: "Cf"},
{label: "Zero-Width No-Break Space (BOM)", cp: U+FEFF, gc: "Cf"},
{label: "Hangul Filler", cp: U+3164, gc: "Lo"},
{label: "Mongolian Vowel Separator", cp: U+180E, gc: "Cn" (deprecated)},
{label: "Combining Grapheme Joiner", cp: U+034F, gc: "Mn"},
...
]
// Click handler:
copy(codepoint) -> navigator.clipboard.writeText(String.fromCodePoint(codepoint))
The General Category determines how downstream systems treat the character. Cf (Format) codepoints are stripped by NFKC normalisation. Mn (Nonspacing Mark) codepoints are kept by normalisation but rendered at zero width. Lo (Letter, other) like Hangul Filler U+3164 is treated as a printable letter and survives more validation paths than the Cf codepoints.
Worked example
Suppose Discord rejects a blank message but you want to post a spacer to break up a long block of replies. Click the Hangul Filler row to copy U+3164:
- Clipboard now contains a 1-codepoint string with byte sequence E3 85 A4 (UTF-8 for U+3164).
- Paste into the Discord message box. The input shows nothing visible but the send button enables because the field is not empty.
- Press send. The message posts as a blank line in the channel; the underlying message body is the single Hangul Filler codepoint, which Discord stores and rebroadcasts intact.
- For a 2-line blank message, paste two Hangul Fillers separated by a newline (Shift+Enter).
Invisible codepoint reference
The most useful invisible codepoints for empty-message tricks and zero-width tracking are listed below with their Unicode General Category and platform support notes.
| Name | Codepoint | General Category | Common use / notes |
|---|---|---|---|
| Zero-Width Space | U+200B | Cf | Word-break hint; stripped by NFKC; used by spambots |
| Zero-Width Non-Joiner | U+200C | Cf | Breaks ligatures (Persian, Arabic typography) |
| Zero-Width Joiner | U+200D | Cf | Builds compound emoji (family ZWJ sequences) |
| Word Joiner | U+2060 | Cf | No-break version of U+200B |
| Zero-Width No-Break Space / BOM | U+FEFF | Cf | Byte-order mark at file start; invisible mid-text |
| Hangul Filler | U+3164 | Lo | Treated as a letter; best for blank messages |
| Mongolian Vowel Separator | U+180E | Cn | Reclassified Cf -> Cn in Unicode 6.3.0; deprecated |
| Combining Grapheme Joiner | U+034F | Mn | Affects collation, not rendering |
| Left-to-Right Mark | U+200E | Cf | Bidi override; invisible directional control |
| Right-to-Left Mark | U+200F | Cf | Bidi override; can hide text past it on some renderers |
Common pitfalls and limitations
- Spambot weaponisation. Zero-width characters are the standard tool for evading keyword filters in phishing emails, romance scams, and spam comments. Inserting U+200B into "paypal" produces a string that looks identical but fails a literal "paypal" substring match. Most security vendors normalise the input by stripping these codepoints before pattern matching, but DIY filters often miss the trick.
- Platform countermeasures. Twitter/X strips all Cf-class codepoints from posts as of 2023. Reddit's automod removes U+200B from comments. Telegram blocks U+180E and U+202E (right-to-left override). The reliable codepoint as of 2026 is U+3164 Hangul Filler, but platforms can change this at any time.
- Screen reader silence. NVDA, VoiceOver, and JAWS skip Cf-class codepoints entirely, so an invisible-character message reads as silent. Some screen readers announce the count of invisibles ("zero-width space, zero-width space, ...") in verbose modes, which is jarring for blind users.
- Right-to-left override abuse. U+202E (Right-to-Left Override) is occasionally listed alongside zero-width characters but is dangerous: a filename like "documentcod.exe" with U+202E inserted before "cod" displays as "documentexe.doc", a known malware vector. Avoid this codepoint outside of legitimate Arabic/Hebrew text.
- Domain confusables. RFC 5891 (IDNA 2008) and Unicode's Confusables file flag zero-width characters as forbidden in domain names because the empty string in front of an A or B character is exploitable for IDN homograph attacks. ICANN registries reject them at registration.
Frequently asked questions
Which invisible character should I use for a blank Discord or WhatsApp message?
Hangul Filler (U+3164) is the most reliable across platforms because it is treated as a printable character (not a control codepoint) by most validators while rendering as nothing. Zero-Width Space (U+200B) works on Discord, WhatsApp, and Telegram but is stripped by some moderation filters. Mongolian Vowel Separator (U+180E) used to work but was reclassified from Cf to Cn in Unicode 6.3.0 and is now blocked on Telegram and X.
Are invisible characters used by spam bots and phishers?
Yes. Zero-Width Space and Zero-Width Joiner (U+200D) are routinely inserted into spam emails to defeat keyword filters: payp[U+200B]al evades a "paypal" substring match. Phishing sites use zero-width characters in domain Punycode to create lookalike URLs. Most modern security tools (Microsoft Defender, Google's Safe Browsing) normalise the input by stripping these codepoints before pattern matching.
Will invisible characters get me banned on social platforms?
It varies. Discord and WhatsApp tolerate small numbers. Twitter/X auto-strips most invisible characters from posts as of 2023. Instagram allows them in bios but flags large counts in comments as spam. Reddit treats zero-width characters as part of the comment, but its automod and many subreddit-specific filters remove them. Stick to one or two invisible characters per message.
How do I detect or strip invisible characters from text I receive?
Filter out codepoints in the Unicode general categories Cf (Format) and Mn (Nonspacing Mark), plus the explicit zero-width characters U+200B to U+200F, U+202A to U+202E, U+2060 to U+2064, U+FEFF, and U+3164. In Python: text = ''.join(c for c in text if unicodedata.category(c) not in ('Cf', 'Mn')). In JavaScript: text.replace(/[---ㅤ]/g, '').
Sources and further reading
- Unicode Consortium (2024) General Punctuation, U+2000 to U+206F.
- Unicode Consortium (2024) UAX #9 Unicode Bidirectional Algorithm.
- Unicode Consortium (2024) UAX #15 Unicode Normalization Forms (NFKC removes most Cf codepoints).
- IETF (2010) RFC 5891 Internationalized Domain Names in Applications (IDNA): Protocol.
- Unicode Consortium (2024) UTS #39 Unicode Security Mechanisms.
