What it was designed for
Korean text processing, as a placeholder for an absent Jamo in an incomplete syllable block. Unicode assigns it to the Hangul Compatibility Jamo block and to General Category Lo, which is Letter, other.
In practice U+3164 is the most widely accepted character for blank usernames in games.
Does U+3164 work as invisible text?
Partly. It survives trim() and changes under NFKC. ItsWhite_Space property is No, so no trimming function removes it, and a name field accepts it.
NFKC folds it to U+1160. A platform that normalizes usernames — which most do, to stop two visually identical names being registered separately — stores that other codepoint instead. The name still displays blank, and the stored value differs from what you pasted.
How it compares to the alternatives
Four properties decide which invisible character to use, and they separate these three cleanly. Hangul Filler is shown against the plain space and against the character most often recommended for blank names.
| Property | U+3164 | U+0020 | U+2800 |
|---|---|---|---|
| Category | Lo | Zs | So |
| Removed by trim() | No | Yes | No |
| NFKC | → U+1160 | stable | stable |
| Rendered width | Wide | Narrow | Wide |
| UTF-8 bytes | 3 | 1 | 3 |
| Works in a name field | No | No | Yes |
Hangul Filler survives trimming like the reference character and differs from it under normalization.
How to type U+3164
To insert U+3164, copy it from the button above. Copying is the only method that behaves identically on every operating system and in every application.
Copy and paste
Use the copy button at the top of this page. Paste into the destination field directly. If the field rejects it, paste into a plain-text editor first and copy from there — rich-text editors and some mobile keyboards rewrite pasted content.
In code
Insert it by escape sequence rather than by pasting a character no reviewer can see. A literal invisible character in a source file is unreadable in review and survives copy-paste into places it was never meant to reach.
- JavaScript and TypeScript —
"\u3164" - Python —
"\u3164" - HTML —
ㅤorㅤ - CSS
content—"\3164" - URL encoding —
%E3%85%A4
Keyboard entry
Keyboard methods exist and none is reliable across systems. On Linux and in most GTK applications, Ctrl+Shift+U followed by 3164 and Enter inserts the character. On macOS, the Unicode Hex Input source acceptsOption plus the four hex digits, and it must be enabled in Keyboard settings first.
Windows Alt codes do not cover this range. The Alt plus numeric-keypad method addresses legacy code pages rather than Unicode codepoints, so it cannot produce U+3164. Copying remains the dependable method on every platform.
Why U+3164 fails, and what to do
It fails when a platform normalizes with NFKC, which silently replaces it with U+1160. Everything else about the character is stable, so a failure almost always traces to that one condition.
The field clears itself after saving. The value was trimmed to an empty string and the platform restored the previous one. Move to a character withWhite_Space=No — U+3164 or U+2800.
A box or question mark appears. The font has no glyph at U+3164, so the renderer drew .notdef. The stored value is correct and only the display is wrong. U+2800 has the widest font coverage of the invisible characters.
The value changes between saving and reloading. The platform normalized it. Hangul Filler folds to U+1160 under NFKC, so that is the codepoint now stored.
Is it a security risk?
Yes, in source code and identifiers, and no in ordinary text. U+3164 is a valid identifier character in JavaScript, so it can name a variable that no code review can see. A published proof of concept adds an invisible destructuring parameter to an Express route and reads an attacker-supplied value from it, creating an authentication path that is invisible in the source.
The exposure is limited to contexts where an invisible character changes meaning without changing appearance. Pasting U+3164 into a username, a bio or a chat message creates no such risk, because nothing downstream interprets it.
To audit text you did not write, match the category with\p{Lo} rather than searching for this codepoint alone.
How to find it in existing text
Match it by category rather than by codepoint. The regex\p{Lo} matches Hangul Filler and every other character in its category, and it keeps working across Unicode releases.
To confirm whether a specific string contains it, paste the string into the invisible text detector, which lists every codepoint with its category and byte length.