Remove Invisible Characters
Paste your text to delete zero-width spaces, byte order marks, soft hyphens and other characters you cannot see. No-break spaces become normal spaces, and a table lists every character found.
0 words 0 characters 0 lines
Continue with this text: Remove extra spacesCharacter counterCompare texts
Your text stays in your browser: nothing is uploaded or stored on a server.
How to use it
- Paste your text into the box, open a plain-text file with Open file, or press Example to load a sample with five hidden characters in it.
- Leave Replace no-break and other special spaces with a normal space ticked unless you want to keep no-break spaces on purpose.
- Leave Keep joiners inside emoji (👨👩👧) ticked if the text has emoji made of several emoji joined together.
- Read the table under the result: it names each character found and how many times, most frequent first.
- Press Copy or Download .txt. Use as input lets you run a second clean-up, for example with the extra spaces remover.
The example text looks like an ordinary sentence, but it contains two zero-width spaces, a no-break space, a word joiner and a byte order mark. The tool reports 5 characters removed or replaced and returns This text looks normal but has hidden characters.
Which characters it finds
The tool checks for 40 characters plus the whole block of Unicode tag characters. They fall into four groups, and each group is handled differently.
| Group | Characters | What happens |
|---|---|---|
| Zero-width and format characters | Zero-width space (U+200B), zero-width non-joiner (U+200C), zero-width joiner (U+200D), word joiner (U+2060), byte order mark (U+FEFF), soft hyphen (U+00AD), Mongolian vowel separator (U+180E), combining grapheme joiner (U+034F), invisible operators (U+2061 to U+2064), tag characters (U+E0000 to U+E007F) | Removed, with the exceptions below for joiners and tags |
| Text direction controls | Left-to-right and right-to-left marks (U+200E, U+200F), embeddings and overrides (U+202A to U+202E), isolates (U+2066 to U+2069) | Removed |
| Space look-alikes | No-break space (U+00A0), narrow no-break space (U+202F), the en quad to hair space range (U+2000 to U+200A, including en, em, figure and thin spaces), medium mathematical space (U+205F), ideographic space (U+3000) | Replaced with a normal space, or left alone if the option is off |
| Blank-looking letters | Hangul filler (U+3164), Braille pattern blank (U+2800) | Removed |
Normal spaces, tabs and line breaks are never touched. Characters outside this list stay as they are, including variation selectors such as U+FE0F. The space look-alikes are the same set that Remove extra spaces turns into normal spaces. A zero-width non-joiner or zero-width joiner between two letters or marks of a non-Latin script (Persian, Hindi) is kept, whatever the options, because there it is part of the spelling; between Latin letters or anywhere else it is removed. Tag characters are listed in the table as one line, “Tag character (U+E0000–U+E007F)”.
The options in detail
Replace no-break and other special spaces with a normal space. A no-break space looks like a space but stops a line from breaking there, and many programs do not treat it as a space when they search, split or compare text. With the option on, each of the 15 space look-alikes becomes one ordinary space and is counted in the table. With it off, they stay and are not listed, so only the zero-width and control characters are removed.
| Before | Option on | Option off |
|---|---|---|
10 kg and 1 000 (no-break and narrow no-break spaces) |
10 kg and 1 000 with normal spaces |
unchanged |
Meeting at 3:00 PM on Oct. 21 (narrow no-break space before PM, no-break space before 21) |
same text with normal spaces | unchanged |
Each special space becomes exactly one space, so two figure spaces in a row become two normal spaces. Run the result through Remove extra spaces if you want them collapsed.
Keep joiners inside emoji. A zero-width joiner glues emoji together: 👨, 👩 and 👧 with joiners between them display as one family emoji. With the option on, a joiner is kept when it sits between two emoji; a skin tone or the emoji presentation selector (U+FE0F) just before the joiner is skipped over, so 👩🏽💻, 🏳️🌈 and ❤️🔥 stay whole. The option also keeps the tag characters that follow 🏴 in the England, Scotland and Wales flags. With it off, every joiner between emoji goes and the family becomes three separate emoji (2 joiners removed), and the England flag loses its 6 tag characters and turns into a plain black flag 🏴.
Worked examples
| Before (hidden characters in brackets) | After | Table shows |
|---|---|---|
user[U+200B][email protected] |
[email protected] |
Zero-width space: 1 |
[U+FEFF]id,name |
id,name |
Byte order mark: 1 |
super[U+00AD]cali[U+00AD]fragilistic |
supercalifragilistic |
Soft hyphen: 2 |
abc[U+202E]def |
abcdef |
Right-to-left override: 1 |
café[U+200B][U+200B][U+200B] |
café |
Zero-width space: 3 |
[U+3164] (a “blank” name) |
empty | Hangul filler: 1 |
Removing a character never adds a space in its place, except for the space look-alikes. If a zero-width space was the only thing between two words, the words join up, which is how they already looked on screen.
When people need it
- A CSV header that will not match. Files saved as “UTF-8 with BOM” start with U+FEFF. The Unicode FAQ notes that a BOM interferes with any format that expects specific characters at the start of a file, so a script looking for a column called
idmay not find it. - Spreadsheet lookups that fail. Excel’s CLEAN function removes only control characters 0 to 31, and TRIM removes only the normal space; Microsoft’s own help pages say neither removes the no-break space (character 160). Text copied from a web page into a cell often carries one.
- Code, URLs and logins that look right but do not work. A zero-width space inside a variable name, a link or a username makes it a different string. Pasting it here shows exactly where the extra character came from.
- Text copied from chat tools, web pages, PDFs and word processors. Any of them can carry soft hyphens, no-break spaces or direction marks. The table tells you what was actually there, instead of guessing.
- Checking a character count. Hidden characters count toward limits on forms and social posts. Clean the text, then check it with the character counter.
To see exactly what changed, paste the original and the cleaned text into Compare texts.
When to keep a character
Some of these characters do a job. The Unicode Standard describes the zero-width non-joiner as a way to change how letters connect, as is sometimes required in Persian written in Arabic script. The tool keeps it when it sits between two letters of a non-Latin script, so میخواهم keeps its spelling. The zero-width joiner, which Indic scripts such as Hindi use to ask for a half form, is kept between two letters or marks of those scripts too, so क्ष comes out unchanged and nothing is reported. Direction marks keep mixed right-to-left and left-to-right text, such as an English product name inside an Arabic sentence, in the right order; removing them can reorder punctuation on screen. A soft hyphen only shows where a long word may break at the end of a line, so removing it is usually harmless. If your text is in one of these scripts, clean only the parts that need it.
Questions
How do I know if my text has invisible characters?
Paste it into the box. The table under the result lists each invisible character the tool found with a count, and the note shows the total removed or replaced. If nothing is there, you see "No invisible characters found."
Can it remove invisible characters from ChatGPT or other AI text?
Yes. It removes the characters in its list whatever program the text came from. It does not try to guess where the text was written; it only shows which hidden characters are actually in it, so you can see for yourself.
Why does a word look right but fail in search, a formula or a password field?
A zero-width space or a no-break space inside it makes it a different string. "user[U+200B]name" with a zero-width space is not equal to "username", even though both look the same. Clean the text here and try again.
How do I remove invisible characters in Excel?
Excel's CLEAN function removes only the control characters 0 to 31, and TRIM removes only the normal space (32), so neither removes the no-break space (160) or zero-width spaces. Paste the column here, clean it, and paste it back, or use SUBSTITUTE(A1,CHAR(160)," ") for no-break spaces.
Will it break my emoji?
Emoji such as 👨👩👧 are built from several emoji joined by zero-width joiners. With "Keep joiners inside emoji" ticked, a joiner between two emoji stays, also when a skin tone or a variation selector comes before it, so 👩🏽💻, 🏳️🌈 and ❤️🔥 stay whole. The hidden tag characters inside the England, Scotland and Wales flags are kept too.
Can I use it to get an invisible character for Discord or a game name?
No. This tool only removes characters. The guide to zero-width spaces and invisible characters explains what each one is and why sites often block them in names.
Is my text sent anywhere?
No. The cleaning runs in your browser and the text is not uploaded.