Invisible Characters in Text
Invisible characters are the ones your eyes cannot see but every computer can, and this page finds all named ones: plus the three private-use ranges, which hold no standard characters of their own, in whatever you paste, names them, counts them and takes them out. Copy text out of a chat window, a PDF or a Word document and something you can't see almost always comes with it: a zero-width space, a stray joiner, a non-breaking space standing in for a normal one. Free, no sign-up, and the cleaning is done by your own browser. People often call the paste-in clutter invisible texts because the message reads fine on screen while still carrying characters nobody typed on purpose.
Last updated: September 2026
Cleaning happens in your browser: that text never leaves this page, and there is no upload, no account and no limit. Rewrite is the exception: that one sends your text to our server.
How it works
- Paste your text in the box above. The check starts the moment the text lands there: there is no upload step and no button to press first, because the counting happens on your own machine.
- Read the count per character type. You get one line with the total ("Found 6 hidden characters in 240 characters") and a small table under it naming every type it found, Zero Width Space, Non-Breaking Space, Soft Hyphen, with how many of each. Below that, a preview of your text with each hidden character shown in place as its code point, so you can see exactly where they sit.
- Press Clean text, then copy. The box is replaced by the cleaned version and the Copy result button switches on. Your visible words come back character for character as you wrote them, minus the debris.
What counts as an invisible character
Anything that changes what a computer reads without changing what your eyes see: these invisible unicode characters take up no visible space at all. The paste above looks identical before and after; that is the whole problem. A few of the most common ones, out of the named characters the tool checks for:
- Zero-width space (U+200B). No width, no glyph, but it splits one word into two as far as search, spellcheck or a CMS field is concerned.
- Zero-width joiner (U+200D). Glues emoji into one figure (π¨βπ©βπ§ is three emoji held together by two of these), which is exactly why it is kept between emoji and only stripped when it turns up wedged between ordinary Latin letters.
- Word joiner (U+2060). Tells software "never break a line here" without drawing anything: it just sits there until a script trips over it.
- Soft hyphen (U+00AD). Invisible unless the word wraps at that exact point, where it turns into a hyphen no one typed. PDFs and word processors both insert these.
- Non-breaking space (U+00A0). Looks like a normal space, behaves like glue: it will not break a line and it will not match a normal space in a search.
- And the rest: Unicode tag characters (U+E0000: U+E007F, a block with no visible form at all), direction marks, variation selectors, the byte-order mark, and private-use characters. See all invisible characters this tool checks for.
Read more
A non-breaking space, a narrow no-break space or any other invisible space character all look like an ordinary gap on screen, yet each behaves differently to software that expects a plain one: which is exactly why this page turns them all into a normal space.
People also call this whole group empty characters because each one takes up a position in the text without drawing anything you can see.
ASCII and Unicode differ here. Invisible ascii characters are the plain space, tab and line feed: ordinary keyboard characters the Clean button leaves untouched, because they are meant to be there. An ASCII invisible character of that kind is part of your layout, not debris. The Unicode kind is different: an invisible character Unicode defines, such as a zero-width space, is what usually causes real problems. What actually breaks a CMS field or a script is almost always one of those: characters no keyboard can type, hiding inside text that was copied rather than typed. For the paste-and-clean job this page is an invisible character tool. Think of it as an invisible character viewer, too: the count and table above show what's there before anything is removed.
Do invisible AI characters exist as a separate category? They don't: the same 127 named characters apply whether an AI assistant, a PDF or Word put them there, so text from an AI this cleaner handles exactly like any other paste. Press the one Clean button above either way.
If you're after an invisible characters decoder: something that names each hidden character rather than just deleting it. That's exactly what the table above does before you press Clean. As for an invisible character alt code: most of these don't have a simple Windows Alt code, which is part of why they're easy to miss.
The count table above is the invisible character checker: a quick check starts the moment you paste. A common case is invisible characters in code: a zero-width space inside a variable name is invisible in the editor and still breaks the build.
Detection happens before Clean does anything: the count and table together are the detection step, so the page works as an invisible character detector on its own. That includes checking a comment thread or a code comment for hidden characters, which this box handles the same as any other paste.
A different job altogether is getting invisible text for a name: an invisible nickname or an invisible username, a blank-looking character to paste into a TikTok, Discord, Instagram or game display name. That is not what this page does: it finds and removes invisible characters that are already in text you pasted, it does not hand you a fresh one to reuse as a name. If that is what you were after, this is the wrong tool for the job.
If you want to copy invisible character symbols out of an editor to reuse elsewhere, that is a different job too: this tool does not hand one out, it only works on text that is already sitting in the box above.
Paste any invisible character text into the box above and the table does the rest: every invisible character symbol it finds is named, not just counted. An invisible special character such as a tag character is on the same 127-character list. Each row shows the invisible character name next to its code point. A zero-width joiner or a tag character counts as an invisible character that is not a space, because it takes up no width at all: unlike a non-breaking space, which at least occupies one.
Every invisible Unicode character copy paste carries in shows up in the table before Clean removes it. There isn't a simple alt code for invisible character entries either: most of the 127 have no standard Windows shortcut, which is part of why they are easy to miss and easy to paste in by accident. No invisible keyboard character exists for these: none has an ordinary key combination, only a code point. So how to type invisible character codes by hand? A keyboard alone can't; this page finds and removes the ones already sitting in text you paste, rather than producing a new one to type out. An invisible Japanese character is named and counted like any other, whatever language surrounds it. An invisible Arabic character built from a zero-width non-joiner is left alone on purpose, the same as for Persian and the Indic scripts: Ω ΫβΨ±ΩΩ is the Persian example already covered in the FAQ above.
A copy and paste invisible emoji is a fresh symbol to paste into a bio, and this page only works in the other direction: finding and removing characters already in text you paste, never generating a new one. A white character is the same blank-looking thing under another name; paste your text and the table names whatever is actually there. A blank Steam display name (the invisible character Steam trick) needs a generator rather than this cleaner, and so does an invisible character for Steam artwork titles. The same limit applies to an invisible character Epic Games name or an invisible character Twitter handle: no blank name is generated here, only removal from text you already have. An invisible braille character is often wanted for that same blank-display trick, and this page still won't produce one.
Which invisible characters this removes
Below is what a real paste almost always contains, with the code point of each one so you can look it up or find it in your own document. The full set the tool checks is named characters plus the three private-use ranges; this table is the part you will actually meet. Looking for an invisible character ASCII table instead? That's the handful of plain keyboard characters covered above; this table is the Unicode kind.
Read more
| Name | Code point | Where it comes from | What it breaks |
|---|---|---|---|
| Zero-width space | U+200B | chat replies, copied web pages | splits one word into two: search, spellcheck and a CMS field stop matching it |
| Zero-width non-joiner and joiner | U+200C, U+200D | emoji, Persian and Indic spelling, pasted web text | between ordinary letters it breaks code and search: between emoji it is doing its job, so it stays |
| Word joiner | U+2060 | typeset text and PDFs | forbids a line break where you wanted one, and a script trips over it |
| Soft hyphen | U+00AD | PDFs, Word | turns into a hyphen nobody typed as soon as the line wraps, and form validation rejects it |
| Non-breaking space | U+00A0 | Word, Google Docs, web pages | looks like a space but never matches one in find-and-replace |
| Narrow no-break space | U+202F | French typography, autocorrect | the same, and it is narrower, so columns stop lining up |
| The other Unicode spaces | U+1680, U+2000 to U+200A, U+205F, U+3000 | PDFs and typeset documents | all of them read as a space to you and as something else to software |
| Byte-order mark, also called the zero-width no-break space | U+FEFF | exported CSV and text files | the first column heading no longer matches, and a parser throws an error on line 1 |
| Unicode tag characters | U+E0000 to U+E007F | text with a hidden payload written into it | an invisible message rides along inside your paste: almost no cleaner looks in this block |
| Direction marks, embeddings and isolates | U+200E, U+200F, U+202A to U+202E, U+2066 to U+2069 | text that mixes English with Arabic or Hebrew | reverses the order of what is on screen, so the line reads wrong |
| Variation selectors | U+FE00 to U+FE0F, U+E0100 to U+E01EF | emoji and symbols | after a plain letter it is a leftover: after an emoji it picks the shape, so those stay |
| Invisible maths operators | U+2061 to U+2064 | formulas copied out of a document or a web page | they count as characters and show nothing, so lengths and limits come out wrong |
| Mongolian vowel separator | U+180E | older documents and text databases | invisible, and still counted as a character everywhere |
| Private-use characters | U+E000 to U+F8FF | icon fonts and custom in-house fonts | shows as an empty box or a random symbol on any machine without that font |
| Curly quotes, en dash, em dash, minus sign | U+2018, U+2019, U+201C, U+201D, U+2013, U+2014, U+2212 | autocorrect in Word, Google Docs and chat tools | breaks a string literal, a CSV column or a search: this row is the optional one, and the checkbox above turns it off |
Why the text got these characters
Nothing put them there to trip you up. Where they come from is nearly always one of three places, and each one has an ordinary reason for it.
A chat assistant. ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek and Perplexity all render their replies with characters you never see: zero-width spaces between words, curly quotes, an em dash. Copy the reply and those characters copy with it. If you know which assistant your text came from, the exact list for that one is here: ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Perplexity. It is the same cleaner on every one of those pages: only the framing changes.
A PDF. Select a paragraph in a PDF reader and copy it, and the text layer brings its soft hyphens and non-breaking spaces along: both put there on purpose, to control where the original document broke a line. Paste that into a form field that checks its input and the soft hyphen is usually why it gets rejected.
Word or Google Docs. Autocorrect turns straight quotes into curly ones and a double hyphen into an en dash. Word's own line-breaking quietly adds non-breaking spaces and soft hyphens you never typed. None of it shows in the document. All of it can survive into a plain-text field that was not expecting it.
Spreadsheets. A cell that looks fine but won't match usually hides one of these. Excel doesn't draw them, but paste the cell's text here and the table above names what's there before anything is removed. When you're ready, the Clean button is how to remove invisible characters Excel cells picked up in a paste, and the cleaned text goes straight back in.
What the counter actually shows
Paste your text and the counter above updates as you type. It gives you a total, "Found 6 hidden characters in 240 characters", and underneath it, a table naming each one it found and how many times: Zero Width Space, Non-Breaking Space, Soft Hyphen, and so on. Press Clean text before you look and there is nothing left to count; the counter is there so you can see what was in your text before it is gone.
Questions
What exactly counts as an invisible character?
Anything that changes what a computer reads without changing what you see on screen: zero-width spaces and joiners, Unicode tag characters, direction marks, variation selectors, the byte-order mark, soft hyphens, private-use characters, and odd spaces like the non-breaking space. named characters in total, plus the three private-use ranges.
Does this remove the AI watermark from my text?
It removes the invisible characters, zero-width spaces, joiners, tag characters and the like, that get carried along when you copy text out of an AI assistant. It does not touch your words. Statistical watermarks such as SynthID live in the word choice itself, so no cleaner can remove those without rewriting your text - and the cleaner rewrites nothing. There is a separate Rewrite button for people who want their wording changed; that is a writing aid, not a way around detection.
Does it matter where the text came from: AI chat, a PDF, Word?
No. The tool matches characters, not sources: text copied out of ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek or Perplexity is treated exactly the same as text copied out of a PDF, Word, Google Docs or a web page. Whatever carried the character in, the cleaner finds it the same way.
How do I tell whether a text watermark or a stray character is in my paste?
Paste it into the box and read the count per character type; each hidden character is named with its code point. If the table finds nothing, any text watermark present is statistical and is not something a character check can show.
Is my text uploaded anywhere?
The cleaner runs entirely in your browser: that text never leaves the page, there is no account, and there is no limit on how much you clean. The separate Rewrite button is the one exception: it sends your text to our server, which passes it to Anthropic, whose AI model rewrites it. Only Anthropic receives it, to rewrite it, and Anthropic does not train its models on it. We keep no copy of your text or the rewrite.
Does removing them change the meaning of my text?
No. The cleaner only deletes characters that have no visible shape, and swaps an unusual space for an ordinary one. Your words, their order and their spelling come out identical: run the tool twice and the second pass finds nothing left to remove. The one thing that does change your wording is the separate Rewrite button, and that only runs when you press it.
Will this remove formatting like bold?
There is no formatting left to remove: pasting into a plain-text box drops bold, italics, colour and links before the tool ever sees your text. The only visible change it can make is turning curly quotes and long dashes into straight quotes and a plain hyphen, and the checkbox above the box switches that off if you would rather keep them.
Can teachers or detectors see these characters?
Anyone looking for them can, yes: a zero-width space shows up in any editor with "show invisible characters" switched on, and a script that hunts for them is a few lines long. That is a different thing from an AI detector, which judges sentence rhythm and word choice and is not affected by this tool at all. Cleaning makes your text ordinary; it does not make it undetectable, and it is not meant to. For that first, narrower question, what's actually hiding in your pasted text, this page is an invisible text detector and an invisible character finder, long before you get anywhere near an AI detector.
Does it keep emoji and non-Latin scripts intact?
Yes, and that is deliberate. The joiners inside an emoji family (π¨βπ©βπ§ is three emoji held together by two of them) stay, and so does the zero-width non-joiner that Persian, Arabic and the Indic scripts use as plain spelling: Ω ΫβΨ±ΩΩ without it is a different word. The same character is only removed when it sits between ordinary Latin letters, which is where it is genuinely paste debris.
Why does my text break my CMS or code editor?
Invisible characters survive a copy-paste but are not what they look like. A zero-width space inside a variable name breaks the code, a non-breaking space breaks a search, and a smart quote breaks a string literal. Nothing looks wrong on screen, which is what makes it hard to find, and harder still to remove it by hand, because you cannot select what you cannot see.
Can I copy and paste an invisible character from here?
No. There is no invisible character copy and paste here, and no copy and paste blank space to take: this page works in one direction only. If you just need one invisible space character, most code editors can insert a zero-width space through find-and-replace. To see what is in text you already have, paste it in: as an invisible character viewer it names and counts every one before anything is removed, and to copy invisible character text out cleanly you press Clean and then Copy result. A copy paste invisible character trick from a forum is the opposite job. So is an invisible character copy paste list, or a list of invisible characters copy and paste sites hand out: they give you characters to paste in, while this page finds and strips them.
What are Unicode invisible characters?
Unicode defines named characters that occupy no visible space, among them zero-width spaces (U+200B), zero-width joiners (U+200D), tag characters (U+E0000 block), soft hyphens (U+00AD) and the byte-order mark (U+FEFF), among others. It also reserves three private-use ranges for custom icon fonts that hold no standard characters of their own, plus zero-width non-joiners (U+200C) for keeping letters in a script separate. TextNinja removes the ones that are just leftover formatting, and deliberately leaves the ones still doing a job: a zero-width joiner holding an emoji family together, or a non-joiner that is part of Persian spelling.
Is there an invisible characters detector I can paste text into?
Yes: paste your text into the box and it works as an invisible character detector, highlighting what it finds and counting it before anything is removed, whether the text is fresh or copied out of an old document. It is a detector for invisible characters only; it does not judge whether text was AI-written.
Can I get a blank character for a username, a Discord name or a game?
Not from this page. A blank name, an invisible nickname or an invisible username on TikTok, Instagram, WhatsApp or Discord, or in games such as Minecraft, Fortnite, Roblox, Steam, Epic Games, Call of Duty Mobile, Rocket League, Baldur's Gate 3 or Battlefront 2, needs a generator that hands out a blank character. People call the results invisible names, empty characters or white character names, and the Discord invisible character (or invisible Discord character) for a channel title is the same idea. This tool only finds and removes invisible characters that are already in text you paste; blank characters and invisible texts are what it takes out, not what it gives.
Invisible characters html: how do I catch them before they break my page?
Paste the page's text content into the box above the same as any other text: the check does not care whether it came from a chat reply or an HTML file. A zero-width space or a stray byte-order mark inside an attribute or a class name will not show up in a browser, but it will show up here, named and counted.
Are non-printable characters the same as invisible characters?
Same idea, older name. "Non-printable characters" is the term used in programming and terminal contexts for codepoints with no visible representation, while "invisible characters" is the more everyday phrase for the same thing. The named characters this page checks for, plus the three private-use ranges, cover the ones that actually turn up in ordinary pasted text. A handful of true control codes, such as a raw tab or line feed, are non-printable too but are left untouched here: removing them would change your text's actual layout, not just clean up invisible debris.
Related tools
One cleaner runs behind all of these pages, with one shared list of named characters and one Clean button. Only the explanation around it changes, so pick whichever matches where your text came from.
- Clean text, the main tool, with the full list of everything it removes.
- AI watermark checker, see what's hiding in a piece of text before you decide to clean it.
- AI text remover, what "remove AI from text" actually means, and what does and doesn't do it.
- ChatGPT watermark remover for text copied out of ChatGPT.
- Claude watermark remover for text copied out of Claude.
- Gemini watermark remover for text copied out of Gemini.
- Copilot watermark remover for text copied out of Copilot.
- Grok watermark remover for text copied out of Grok.
- DeepSeek watermark remover for text copied out of DeepSeek.
- Perplexity watermark remover for text copied out of Perplexity.
- Pricing, what stays free and what a pass adds, and who builds this.
What this tool cannot remove
There are two different things people call an "AI watermark".
- Invisible and typographic characters. This tool removes named characters that carry no visible glyph at all, as defined by the Unicode standard: not a number we made up. It also turns different space variants, including the narrow no-break space, into an ordinary space. Curly quotes and dashes go through a separate, optional step, typographic replacements, switched on by default; turn that option off and they stay exactly as typed. It also clears the three Unicode private-use ranges, including the tag range U+E0000, U+E007F used to hide data in plain text, those ranges hold no standard characters of their own, so we describe them rather than dress them up as a character count.
- A statistical watermark in the word choice itself. Google's SynthID, which Google says has marked text in the Gemini app and on the web since May 2024, steers which words get picked and adds no characters at all, so no character cleaner, ours included, has anything to catch. Anthropic says text from its newer Claude models (launched on or after 2 August 2026) carries a statistical watermark applied as the model picks its words, with nothing added to the text (anthropic.com), so no character cleaner touches it. OpenAI announced one for ChatGPT in October 2026 (as reported by the press) that is statistical too, starting in the EU.
If a tool promises to strip "the AI watermark" without making this distinction, it is describing the first thing while letting you believe it does the second.
By Sam Ridder, I build and run TextNinja on my own hardware, on my own. Who I am.