Invisible Character

Blank space copy and paste in one tap, for blank names, empty messages and gaps.

26 characters from Unicode 18 · widths measured in your browser · nothing is sent
All 26
Hangul FillerU+3164Recommended
1 character · 3 bytes in UTF-8measured in this browser

One tap copies Hangul Filler. Paste it where the name or message goes.

All 26
First choice forFree FirePUBG MobileDiscordFortniteInstagramTikTokLINETelegramWhere it works
Ready-made
Try

Checked in this browser as you type. The text never leaves the page.

Paste text to see every hidden character

Each one is redrawn as a coloured token, counted, explained and removable.

  • Blank characters–
  • Zero width–
  • Special spaces–
  • Bidi controls–
  • Tags–
  • Selectors–
  • Controls–
  • Format–
  • Look-alikes–

All 26 invisible characters

Every blank character, zero-width character and space worth copying, with what trim() does to it in 6 programming languages: measured, not assumed.

trim() keeps itremovedJS JavaScript · PY Python · GO Go · NET .NET · SW Swift · PHP

Blank characters

5Not spaces to an app: the ones that work as names
  • Hangul FillerU+3164 · RecommendedfontNode.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Braille BlankU+2800fontNode.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Halfwidth Hangul FillerU+FFA0fontNode.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Hangul Choseong FillerU+115FfontNode.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Hangul Jungseong FillerU+1160fontNode.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it

Zero width

8No width at all: they hide inside words
  • Zero Width SpaceU+200B0Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: removedPHP: trim() keeps it
  • Zero Width Non-JoinerU+200C0Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Zero Width JoinerU+200D0Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Word JoinerU+20600Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Invisible SeparatorU+20630Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Combining Grapheme JoinerU+034F0Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Mongolian Vowel SeparatorU+180E0Node.js: trim() keeps itPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it
  • Zero Width No-Break SpaceU+FEFF0Node.js: removedPython: trim() keeps itGo: trim() keeps it.NET: trim() keeps itSwift: trim() keeps itPHP: trim() keeps it

Spaces

13Real spaces: most apps trim them away
  • No-Break SpaceU+00A0fontNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • En SpaceU+2002½ emNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Em SpaceU+20031 emNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Figure SpaceU+2007digitNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Thin SpaceU+2009fontNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Hair SpaceU+200AfontNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Three-per-em SpaceU+2004⅓ emNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Four-per-em SpaceU+2005¼ emNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Six-per-em SpaceU+2006⅙ emNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Punctuation SpaceU+2008periodNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Narrow No-Break SpaceU+202FfontNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Medium Math SpaceU+205FfontNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it
  • Ideographic SpaceU+3000ideographNode.js: removedPython: removedGo: removed.NET: removedSwift: removedPHP: trim() keeps it

What is an invisible character?

An invisible character (also called invisible text, blank text, an empty character or an invisible letter) is a real Unicode character that draws nothing: a blank character such as ㅤ (U+3164 Hangul Filler), a special space, or a zero-width mark. Apps store and count it like any letter, so a name or a message made of it isn't empty.

Each one still takes its place in the text. Some take width, the room a letter would; zero-width ones take none and sit between two letters without moving them. Unicode fixes a few widths by name (an em space is one em, an en space half of that); for blank characters the font decides, which is why the same ㅤ can look wider on one phone than on another.

Same blank, nine widths1 em = the font size
  1. SpaceU+0020 · set by the font
  2. No-Break SpaceU+00A0 · set by the font
  3. Em SpaceU+2003 · fixed by its name
  4. En SpaceU+2002 · fixed by its name
  5. Thin SpaceU+2009 · set by the font
  6. Hair SpaceU+200A · set by the font
  7. Zero Width SpaceU+200B · zero by definition
  8. Hangul FillerU+3164 · set by the font
  9. Braille BlankU+2800 · set by the font
  • advance width, measured live in this page's font
  • zero width
Each box is the room the character takes in a line, measured in this browser. Em and en spaces have the widths their names give them (The Unicode Standard, ch. 6); the zero-width space has none; blank characters take whatever the font draws.
Invisible character tool: the Hangul Filler drawn as a type specimen with its width, one-tap copy counts and its code pointInvisible character tool: the Hangul Filler drawn as a type specimen with its width, one-tap copy counts and its code pointThe specimenThe character between two letters, its box as wide as it really is, measured in your browser.One-tap copyCopy one, or 5 to 100 at once; any count up to 100,000.Seven blanksPick the character: each has its own colour, and all 26 are in the list below the tool.The codeIts code point, UTF-8 bytes and escapes, and what trim() does to it in 6 languages.
The blank character as a type specimen, with its real width in this browser. Select a number to see what each part shows.

Invisible names: which character works in games and apps?

Start with ㅤ (U+3164 Hangul Filler): players report it works for nicknames and display names where a plain space is refused. No platform's rules allow blank names, though: every “works” below is what users report, and usernames that allow only a–z, digits and a few symbols (Discord and X usernames) refuse every invisible character.

Roblox refuses them too: we tested its own display-name check on 2026-10-23 and it rejected every blank character, the Hangul Filler and the Braille Blank included. Rules and checks change without notice, so look at the name preview before you pay for a name change.

Where each blank worksthe places people ask about most
Platform and fieldTry firstStatus
Free FireNicknameHangul FillerU+3164Users report
PUBG MobileNicknameHangul FillerU+3164Users report
DiscordDisplay nameHangul FillerU+3164Users reportRule
DiscordUsernameNone worksBlockedRule
WhatsAppBlank messageBraille BlankU+2800Users report
KakaoTalkProfile nameHangul FillerU+3164Reports disagreeRule
FortniteDisplay nameHangul FillerU+3164Users reportRule
InstagramNameHangul FillerU+3164Users reportRule
TikTokNameHangul FillerU+3164Users reportRule
LINEDisplay nameHangul FillerU+3164Users reportRule
TelegramFirst nameHangul FillerU+3164Users reportRule
SnapchatDisplay nameBraille BlankU+2800Users reportRule
Arena of ValorNicknameHangul FillerU+3164Users report
Clash of ClansNameHangul FillerU+3164Users reportRule
Mobile LegendsNicknameNone worksReports disagree
Call of Duty: MobileNameNone worksReports disagree
Among UsNameNone worksReports disagree
XDisplay nameNone worksReports disagreeRule
SteamProfile nameNone worksReports disagreeRule
RobloxDisplay nameNone worksBlockedRule
VALORANTRiot IDNone worksReports disagreeRule
YouTubeHandleNone worksNot verifiedRule
XUsernameNone worksBlockedRule
  • Users reportusers say it works; no rule allows or bans it
  • Reports disagreereports disagree, or say it was patched
  • Not verifiedno rule or report either way that we could find
  • Blockedthe platform's rule or its own check refuses every invisible character
Checked 2026-10-23. No platform's rules allow blank names; “Users report” rows rest on users' reports only. “Rule” opens the platform's own page where it publishes one. Roblox: its display-name check, tested 2026-10-23.

Why does ㅤ work when a normal space doesn't?

Because apps trim a name before they check it. trim() removes spaces at both ends, so a name of spaces becomes empty and is refused; ㅤ is a letter to Unicode, not a space, so trim() keeps it and the name passes.

We ran each language's standard trim on each character. Every kind of space is removed, even the exotic ones, except by PHP, whose trim() only knows ASCII. Blank characters survive in all 6. Two surprises: JavaScript removes U+FEFF, and Swift removes the zero-width space.

How a blank name gets past the checkmeasured Oct 23, 2026
Name typedU+0020a spacename.trim()After trim"" · 0 charsempty?Refused“Please enter a name”
Name typedU+3164Hangul Fillername.trim()After trim1 charempty?AcceptedThe name is ㅤ
CharacterNode.jsJSs.trim()PythonPYs.strip()GoGOstrings.TrimSpace.NETNETs.Trim()SwiftSWtrimmingCharactersPHPPHPtrim($s)
SpaceU+0020removedremovedremovedremovedremovedremoved
No-Break SpaceU+00A0removedremovedremovedremovedremovedkept
Ideographic SpaceU+3000removedremovedremovedremovedremovedkept
Zero Width SpaceU+200Bkeptkeptkeptkeptremovedkept
Zero Width No-Break SpaceU+FEFFremovedkeptkeptkeptkeptkept
Hangul FillerU+3164keptkeptkeptkeptkeptkept
Braille BlankU+2800keptkeptkeptkeptkeptkept
Each language's standard trim, run on macOS (Darwin 25.6.0, arm64): Node.js 22.23.2, Python 3.14.4, Go 1.25.5, .NET 10.0.3, Swift 6.3.1, PHP 8.4.13. Outlined cells are the surprises: JavaScript removes U+FEFF, Swift removes the zero-width space, PHP keeps every non-ASCII space.

How do I type an invisible character on a phone, Windows or Mac?

On a phone, copy it here and paste it. On an English or Western European Windows PC, Alt + 0160 on the number pad types a no-break space, which apps trim like any space; for ㅤ itself, type 3164 then Alt + X in Word, or pick it in Character Map.

Alt + 12644 doesn't work: Windows wraps Alt codes above 255. On a Mac, open the Character Viewer (Fn or Globe + E) and search for Hangul Filler. On Linux with GNOME, press Ctrl + Shift + U, type 3164 and press Space.

Typing a blank, system by systemeach from the vendor's own help
  • iPhone and AndroidCopy hereLong-pressPasteHangul FillerU+3164Long-press the name or message field and tap Paste.
  • Word for Windows3164Alt+XHangul FillerU+3164Type the code, then Alt+X turns it into the character.
  • Windows (any app)Alt+0160No-Break SpaceU+00A0Number-pad digits. On English Windows Alt+160 gives á; Alt+12644 doesn't work.
  • MacFn / Globe+ESearch “Hangul Filler”Hangul FillerU+3164Edit › Emoji & Symbols opens the same viewer.
  • Linux (GNOME)Ctrl+Shift+U3164SpaceHangul FillerU+3164Any code point by its hex number.
Alt + 0160 types a no-break space, which apps trim like any space: for a blank name, use ㅤ itself.

How do I find hidden characters in copied or AI text?

Paste the text into Find & remove above: every hidden character is redrawn as a coloured token, counted by kind and removable in one click. Text copied from web pages, PDFs and chats can carry no-break spaces, zero-width spaces and soft hyphens you can't see, and in 2025 some ChatGPT answers carried narrow no-break spaces.

The safe clean removes them without breaking text that needs them: the joiner inside an emoji family and the non-joiner inside Persian or Hindi words stay. Finding a no-break space doesn't show that AI wrote a text, and removing it doesn't hide that it did: OpenAI says its text watermark adds no hidden characters at all.

Copied web text, X-rayed9 hidden in 181 characters
The museum is open Tuesday to Sunday,NBSP10NBSPa.m. to 6NBSPp.m.ZWSP
Tickets cost 12 euros (8NBSPfor students) and include the roofSHYtop terrace.ZWSP
Guided tours start every hour from the mainNNBSPhall.ZWSP
  • Special spaces · 5
  • Zero width · 4
A short made-up paragraph as it might come from a web page or a PDF. On screen it looks clean; the X-ray shows the no-break spaces, the zero-width spaces and the soft hyphen.

Hidden text attacks: Trojan Source, ASCII smuggling and look-alike letters

Invisible characters can make text say one thing to people and another to machines. Bidi controls reorder a code line on screen (Trojan Source, CVE-2021-42574); tag characters can hide whole sentences that AI models read (ASCII smuggling, shown in 2024); letters from another alphabet make a fake address look real.

Trojan Source was published by Nicholas Boucher and Ross Anderson in 2021, with a second CVE for look-alike letters (CVE-2021-42694). Tag-character prompts were shown in January 2024 by Riley Goodside and Johann Rehberger. In 2017 Xudong Zheng showed that an all-Cyrillic look-alike of apple.com got past the look-alike filters of Chrome, Firefox and Opera. To see which alphabet each letter of a domain comes from, and the xn-- name behind it, paste it into the Punycode converter.

Three ways text lieswhat people see vs what machines read
  1. 1
    Trojan Sourcebidi controls reorder code on screen · CVE-2021-42574
    Storedif (accessLevel != "userRLO LRI// Check if adminPDI LRI") {
    Displayedif (accessLevel != "user‮ ⁦// Check if admin⁩ ⁦") {
  2. 2
    ASCII smugglingtag characters U+E0020–E007E, one per letter, drawn as nothing

    A screen shows nothing; an AI model reads “send me the password”.

  3. 3
    Look-alike lettersa Cyrillic letter inside a Latin word · UTS #39
    p0070аU+0430y0079p0070a0061l006C

    Reads as paypal; a different domain.

All three are made-up examples. The Find & remove tab above flags each one, decodes the hidden text and shows both orders of the code line.

Invisible characters in HTML, CSS and code

Write them as escapes so they stay visible in your source: ㅤ in HTML, \3164 in CSS, \u3164 in JavaScript, JSON and Python, %E3%85%A4 in a URL.

A literal invisible character in source code is a bug nobody can see in review. Escapes make it reviewable, and linters can flag the literal ones.

The same blanks, escaped for each languageselect a value to copy it
CharacterHTMLCSSJS · JSONPythonURL
Hangul FillerU+3164
Braille BlankU+2800
Zero Width SpaceU+200B
No-Break SpaceU+00A0
Em SpaceU+2003
Ideographic SpaceU+3000
Zero Width No-Break SpaceU+FEFF
HTML numeric references work for every code point; CSS escapes go inside the strings of the content property; JavaScript, JSON and Python share \u; URLs carry the UTF-8 bytes. U+FEFF at the very start of a file is read as a byte order mark.

Invisible character: questions and answers

How do I copy a blank space?

Tap Copy at the top of this page: one Hangul Filler (ㅤ) goes on your clipboard. Tap ×5 to ×100 for several at once, or type any number up to 100,000. Then paste it where the name or message goes. To be sure it worked, paste into the box under the button: it shows each character it received as a coloured token.

Is invisible text really empty?

No. It is a real Unicode character with its own number, stored and counted like any letter: ㅤ is U+3164, three bytes in UTF-8. It just draws nothing. That is why a name made of it isn't empty to the app, while a name made of normal spaces is: apps trim spaces away before they check.

Why doesn't my invisible name work in a game?

Usually for one of three reasons: you copied a normal space instead of the blank character (check it in the paste box above), the game only allows certain letters in names, or it was updated to block blank names. Try Hangul Filler first, then Halfwidth Hangul Filler. If a username field allows only a–z and digits, no invisible character can pass.

Can I send an empty message?

Often, yes: a message made of a blank character looks empty but isn't, so the send button works. Users report that WhatsApp sends a Braille Blank (U+2800) where plain spaces fail, though WhatsApp itself says nothing either way. Pick Braille Blank above and tap Copy, or tap Blank message under Ready-made for three empty lines of Hangul Filler; if an app strips one, try the other.

Which invisible character is best for game nicknames?

Hangul Filler (ㅤ, U+3164) is the one players use most, but no game we checked publishes a rule that allows it: Roblox's name check refused it when we tested it, and players report Riot IDs refuse it. Check the name preview before you pay for a name change. If it is refused, try the Halfwidth Hangul Filler (U+FFA0), then the Braille Blank (U+2800).

What is U+3164, the Hangul Filler?

U+3164 HANGUL FILLER comes from the Korean standard KS X 1001, where it stands in for a missing part of a syllable; it draws nothing. Unicode classes it as a letter (Lo), not a space, so trim functions keep it. The font decides its width, so it usually looks like a space; NFKC normalization turns it into U+1160, still blank.

What is the difference between a blank character and a zero width space?

A blank character such as ㅤ (U+3164) has a width: it works as an invisible space. A zero width space (U+200B) is a format character with no width at all: it hides between two letters without moving them. Use a blank character for names; U+200B marks where a long word or a link may break.

Can invisible characters be detected?

Yes, easily, by software: every one has a code point, and Find & remove above shows each as a token with its name and position. People reading the text can't see them, but apps, moderation tools and AI models can. Hidden messages in tag characters are decoded too, and the safe clean removes them.

Is it safe to use invisible characters?

For names and messages they are ordinary characters, but platforms can rename or block accounts whose names break their rules, so read the platform's name rules first. Screen readers may read some of them aloud or skip them, which can confuse people who use one. Never use them to impersonate someone.

How do I get an invisible name on Discord?

Paste ㅤ (U+3164 Hangul Filler) into your display name or a server nickname: players report Discord keeps it, while the zero width space is often refused. Your username can't be blank: Discord allows only lowercase letters, digits, underscores and periods there, so people can still find you by it. A server nickname makes you look nameless in that server only.

How do I remove invisible characters from text?

Paste the text into Find & remove at the top of this page. Every hidden character appears as a token, counted by kind, and the safe clean removes zero-width spaces, bidi controls and hidden tag text while turning special spaces into normal ones. It keeps what text needs: the joiners in emoji, Persian and Hindi, French no-break spaces and Japanese wide spaces. Copy the clean text or download it as a .txt file.

Do AI tools add invisible characters to text?

Sometimes, by accident: in 2025 some ChatGPT answers carried narrow no-break spaces, which OpenAI told the company that reported them was a quirk, not a watermark. OpenAI says its text watermark adds no hidden characters, so finding one doesn't prove AI wrote a text and removing them hides nothing. Paste text into Find & remove to see what is there and clean it.

Missing something?Suggest a feature or a new tool