Skip to content
Shaflex

Invisible character remover

Paste a post, a reply or text from an AI chat and see every character you can't see, where it sits and what it costs on X: zero-width spaces, stray joiners, direction marks, tag characters, odd spaces and β€œbold” letters made of maths symbols. Remove them in one go, and keep the ones that hold an emoji or a word together.

Runs in your browser. Your text and images never leave it.

Updated

What to clean

Zero-width characters, direction marks, soft hyphens, stray selectors and tags, blank fillers, private use and unassigned characters.

No-break, thin and other spaces become plain spaces.

𝗕𝗼𝗹𝗱 and π˜ͺ𝘡𝘒𝘭π˜ͺ𝘀 maths letters become normal ones.

What we found

Paste or type some text to check it.

What it finds

Characters that take no space, change how text runs or only look like letters. Each has a job somewhere in Unicode; in a post, most of them are leftovers.

Characters the remover finds
KindFor exampleWhat it does in a post
Zero-width characterZero width space (U+200B), word joiner (U+2060), byte order mark (U+FEFF)Takes no space, but it's there: it splits words for search, breaks a link or a #tag, and counts toward the limit.
Unusual spaceNo-break space (U+00A0), narrow no-break space (U+202F), thin space (U+2009)Looks like a space but isn't one: it can stop a line from wrapping or a word from matching. The cleaned text has a normal space.
Direction markLeft-to-right mark (U+200E), embeddings and overrides (U+202A to U+202E), isolates (U+2066 to U+2069)Changes which way text runs. Stray ones can flip punctuation or numbers to the wrong side.
Soft hyphenSoft hyphen (U+00AD)Invisible unless a line breaks there. It still splits the word for search and hashtags.
Variation selectorVariation selectors (U+FE00 to U+FE0F, U+E0100 to U+E01EF)Picks how the character before it looks. With nothing to change, or in a run, it's invisible and can carry hidden data.
Tag characterTag characters (U+E0000 to U+E007F)Belongs inside a few flag emoji. Anywhere else it's invisible text: whatever it spells, nobody reading the post sees it.
Blank-looking characterBraille pattern blank (U+2800), Hangul filler (U+3164)Draws as empty space, often to fake a blank line or an empty name. Screen readers may read it out.
Invisible formatting characterAny other invisible format character, like the interlinear annotation marks (U+FFF9 to U+FFFB)Formatting with nothing to format in a post. It takes no space but still counts.
Private use characterPrivate use areas (U+E000 to U+F8FF, and planes 15 and 16)Means whatever one font says it means. Most screens draw a box or nothing, so readers see something different from you.
Unassigned code pointCode points with no character yet, and noncharacters like U+FFFENot a character Unicode knows. It shows as a box or nothing, and it often hides data or comes from broken text.
Styled letters𝗕𝗼𝗹𝗱, π˜ͺ𝘡𝘒𝘭π˜ͺ𝘀, π“ˆπ’Έπ“‡π’Ύπ“…π“‰ and πš–πš˜πš—πš˜ letters (U+1D400 to U+1D7FF)Maths symbols that look like bold or italic letters. Screen readers may skip them or read each one out, search doesn't match them, and they cost more on some networks.

What it keeps, and why

Some invisible characters are doing a job. Removing every one of them, the way a find-and-replace would, breaks text.

  • Joiners inside emoji. πŸ‘©β€πŸ’» is a woman and a laptop joined by a zero width joiner. Take it out and you post two emoji.
  • One selector after an emoji. ❀️ is a heart and a variation selector that asks for the colour version. A run of selectors after one emoji is a different thing: it's how data gets hidden in text, so those go.
  • Tags inside a flag. The flags of England, Scotland and Wales are a black flag, tag characters spelling the region, and a closing tag. Tags anywhere else go.
  • Joiners in scripts that need them. Persian, Hindi and other scripts use the zero width joiner and non-joiner to shape letters. Between their letters they stay; between Latin letters they go.

What hidden characters cost you

You can't see them, but every network counts them.

One zero width space counts 1 on X, 1 on Bluesky and 1 on LinkedIn. A few of them won't push a post over, but they do quieter damage: a zero width space inside a #tag or a link splits it, so the tag stops matching and the link breaks where it sits.

Styled letters cost more than they look. Each one is a single character on Bluesky, so β€œπ—›π—²π—Ήπ—Ήπ—Όβ€ is 5 there, but X counts every one of them as 2: β€œπ—›π—²π—Ήπ—Ήπ—Όβ€ is 10 on X, where β€œHello” is 5.

Why β€œbold” text from a generator isn't bold

Social posts don't have bold or italics. The generators fake it with maths symbols that look like letters.

Unicode encodes bold, italic, script and other letter styles for mathematics, where a bold x and a plain x mean different things. The Unicode Standard says these characters shouldn't be used to style ordinary text.

When they are, screen readers may skip the words or read each letter out as a maths symbol, search inside the network doesn't match them, and a #tag written in them isn't the tag you meant. Turning them back into plain letters fixes all three. If a word needs weight, put it first in its line, or on a line of its own.

Does Shaflex post my cleaned text to every network?

Yes. Paste the clean draft into Shaflex once and it makes a copy for each of Threads, X, Bluesky, Mastodon and LinkedIn, each fitted to that network's limit and split into a thread where it runs long, then schedules them together.

Questions

How do I remove invisible characters from text?

Paste the text into the box at the top of this page. Every hidden character is listed by name and marked where it sits, and the cleaned text is ready to copy, with the zero-width characters gone and odd spaces turned into normal ones.

How do I check text for invisible characters?

Paste it into the box at the top of this page. Each invisible or format character is listed with its name, its Unicode code point and the position of every copy of it, counted the way you see the text, and it's marked in place in the text below. If nothing's listed, every character is one you can see.

What do invisible characters cost on X?

X counts them even though nobody sees them, and not all at the same rate: a zero width space counts 1, a no-break space 1, a left-to-right mark 2 and a byte order mark 2. The list shows what each one adds to your count on X, and the cleaned text shows what you get back on every network.

Does ChatGPT or other AI text have invisible characters?

Sometimes. Text copied from an AI chat, a web page, a PDF or a word processor can carry no-break spaces, zero-width spaces or direction marks. Whether any AI adds them on purpose, as a watermark, isn't something we can confirm. Either way, this tool finds what's there, whatever put it there.

Will removing them break my emoji?

No. Many emoji are built from several characters held together by invisible ones: πŸ‘©β€πŸ’» is a woman, a zero width joiner and a laptop, ❀️ is a heart and a variation selector, and some flags hide tag characters. The remover reads your text the way your screen draws it, so those stay. Only stray ones go.

Why turn bold or italic letters into plain text?

Because they aren't letters. Unicode β€œbold” and β€œitalic” text is built from maths symbols, and Unicode says they shouldn't be used for styling. Screen readers may skip them or read each one out, search doesn't match them, and on X each one counts 2, so β€œπ—‘π—²π˜„π˜€β€ costs 8 where β€œNews” costs 4.

Does it remove em dashes or curly quotes?

No. They're ordinary punctuation you can see, so the remover leaves them alone. It only touches characters you can't see, unusual spaces and styled letters, and each has its own switch.

Is my text saved or sent anywhere?

No. It's checked in your browser, and your text isn't stored or sent.

Write the next post once.

Shaflex fits it to Threads, X, Bluesky, Mastodon and LinkedIn, schedules it on your rhythm and brings the replies back to you.

Free plan, no card needed.