Invisible Characters Are Hiding in Your Text — Here Is How to Find Them
Every character on this page has a code point — a number assigned by the Unicode standard that tells your computer exactly which symbol to draw. Most of the time, what you see is what you get. But Unicode also defines dozens of characters that render as nothing at all: zero-width spaces, invisible joiners, direction-control marks and tag characters that survive copy-paste while remaining completely invisible in editors, browsers and chat apps. A sentence can look perfectly ordinary while carrying a dozen extra code points you never typed.
This matters far beyond curiosity. A zero-width space wedged inside a password or a discount code makes it silently wrong when pasted into a form. A non-breaking space in a spreadsheet column breaks VLOOKUP-style matching because the computer sees a different character than you do. Copy-paste from Word, PDFs and AI chatbots routinely injects curly quotes, em dashes, narrow no-break spaces and byte-order marks that trip up code editors, LaTeX compilers, CSV imports and content-management systems. Security researchers even track "Trojan Source" attacks, where bidirectional override characters flip the visual order of code so that what reviewers read is not what the machine executes. The common thread: the human eye cannot audit what it cannot see, so you need a detector that shows you the raw code points.
The Usual Suspects: Zero-Width Characters
The most common invisible culprits live in the Unicode general-punctuation block. The zero-width space (U+200B) is the classic: it takes up no horizontal space and has no glyph, yet it is a real character that breaks string equality — "hello" and "hello\u200B" look identical but are different strings. Its siblings include the zero-width non-joiner (U+200C) and zero-width joiner (U+200D), which legitimately control ligature formation in scripts like Arabic and Devanagari, and also appear inside complex emoji sequences such as family emoji. Because they are invisible, they are also abused: pasted AI output, "anti-plagiarism" spinners and fingerprinting scripts sprinkle them between words where readers never notice.
GhostGlyph flags each of these individually and shows exactly where they sit in your text. When you clean them, the joiners are removed while ordinary letters and legitimate emoji are preserved. A good rule of thumb: if you did not type the zero-width character deliberately — for example to shape a ligature in Persian or Hindi — it is noise and can safely go.
Spaces That Are Not Spaces
Your spacebar produces U+0020, the ordinary space. Unicode defines more than a dozen other space characters that look like it but behave differently. The non-breaking space (U+00A0) prevents a line break — Word and many websites insert it between numbers and units, and web pages use it to keep "10 km" together. The narrow no-break space (U+202F) is its slimmer cousin and has become famous because several generations of AI chat models emit it where an ordinary space belongs, a quirk documented across 2025 that still shows up in pasted chatbot output today. The figure space (U+2007) matches the width of a digit, the word joiner (U+2060) glues words together invisibly, and the ideographic space (U+3000) is a full-width space used in CJK typography.
Why care? Non-breaking spaces are the number-one cause of "the values look the same but the formula says FALSE" mysteries in spreadsheets. They defeat trim() functions in some languages, confuse search engines indexing your content, and break command-line arguments copied from documentation. GhostGlyph's cleaner converts all of these impostor spaces back into ordinary spaces, so the text behaves exactly the way it looks.
The Soft Hyphen and the Byte-Order Mark
Two more characters deserve special attention because they are invisible in some contexts and visible in others. The soft hyphen (U+00AD) is a hint to the typesetter: break the word here if you must hyphenate at line end. In HTML it is invisible until a line break lands exactly on it, at which point a hyphen appears from nowhere. Copy a paragraph from a professionally typeset PDF and you may inherit dozens of them, silently changing word tokens for search and text processing.
The byte-order mark (U+FEFF) is a legacy of the UTF-16 era: a signature placed at the very start of a file to declare its encoding. Some Windows editors still prepend it to UTF-8 files, and web servers serve it along with the page. It renders as nothing, but it shifts string offsets, breaks JSON parsers that do not expect it, and shows up as a mystery character in concatenated files. GhostGlyph detects and strips it wherever it appears.
Bidirectional Overrides: When Text Lies About Its Order
Unicode supports mixed left-to-right and right-to-left text through explicit direction controls: U+202A through U+202E (embedding and override marks) plus the newer isolate marks U+2066 through U+2069. Normally these are balanced and harmless. Unbalanced, they become the "Trojan Source" attack demonstrated by security researchers in 2021: a right-to-left override (U+202E) can make source code display as harmless while the underlying bytes do something else, which is why compilers like Rust now warn about them.
You do not need to be a programmer to care. A bidi override pasted into a chat message or document can visually reorder a URL, a bank account number or an instruction so that what you read is not what you copy. GhostGlyph treats every unmatched direction control as a critical finding and removes them during cleaning — the single most impactful hygiene step this tool performs.
Homoglyphs: Letters That Wear a Disguise
A homoglyph is a character from one script that is visually indistinguishable from a character in another. Cyrillic "а" (U+0430) and Latin "a" (U+0061) look identical in almost every font; the same is true for Cyrillic "е"/Latin "e", "о"/"o", "р"/"p", "с"/"c", "х"/"x", and Greek "ο"/Latin "o" or "ρ"/Latin "p". Whole alphabets overlap: Cyrillic capital "АВЕКМНОРСТХ" maps one-to-one onto Latin "ABEK MHOPCTX" visually, and fullwidth "a" (U+FF41) mimics Latin "a" at double width.
This is the engine of homograph phishing: "apple.com" with a Cyrillic "а" resolves to a different domain than the real Apple. But the danger is not only phishing. A homoglyph in a username, a brand name or a code identifier breaks logins, searches and builds in ways that are maddening to debug because the text looks correct. GhostGlyph's homoglyph scanner shows a side-by-side comparison — the suspicious character next to its Latin look-alike, both labeled with code points — so you can judge instantly, and the cleaner can normalize them back to plain ASCII as an explicit opt-in.
The AI Copy-Paste Problem: Em Dashes, Smart Quotes and Ghost Spaces
Text copied out of AI chatbots, Word and PDFs arrives with typographic passengers. Em dashes (U+2014) where a human would type a hyphen, curly "smart" quotes (U+201C, U+201D, U+2018, U+2019) where a human would type straight ones, ellipses (U+2026) instead of three dots, and narrow no-break spaces where ordinary spaces belong. None of these are malicious, but they are the fingerprints of machine-generated or machine-typeset text — and they cause real friction: smart quotes break code and SQL, em dashes confuse CSV column widths, and ghost spaces break plagiarism checkers, CMS slugs and search.
GhostGlyph's AI-text scan mode flags exactly this family of characters. It does not claim to detect AI authorship — invisible characters are neither proof of AI writing nor proof of human writing — but it reliably finds the formatting residue that copy-paste leaves behind. The cleaner's "normalize AI punctuation" option converts smart quotes to straight quotes, em dashes to spaced hyphens and ellipses to three dots, producing plain, portable ASCII-friendly text.
How GhostGlyph Works: Scan, Annotate, Clean
Using the tool takes seconds. Paste your text into the left bench and press Scan. The engine walks the string code point by code point — using proper Unicode-aware iteration, so emoji and other characters outside the basic multilingual plane are never split — and matches each code point against a curated table of invisible, direction-control, suspicious-space and homoglyph characters. Findings appear in the annotated output on the right: flagged glyphs are highlighted in place with a small U+XXXX label, and hovering any flag reveals the character's official Unicode name and category.
The detection summary strip counts findings per category, and the character-map overlay toggle goes one step further, labeling every character in the text with its code point — a full X-ray view that is genuinely rare among free web tools. When you are ready, Clean text removes or normalizes each category you have ticked, then lets you copy the result, copy a per-category count summary, or download the cleaned text as a .txt file. Recent scan summaries are kept in your browser's local storage so you can compare runs; nothing is ever uploaded because there is no server — the entire analysis happens in JavaScript on your device.
Practical Workflows: Who Needs This and When
Writers and editors use invisible-character detection before publishing: paste a draft, strip the ghost spaces and smart quotes, and the CMS, the newsletter tool and the ebook converter all behave. Developers paste suspicious strings — API keys, tokens, webhook URLs, SQL fragments — to find the zero-width space that is breaking authentication. Students and researchers clean citations copied from PDFs, where soft hyphens and ligature artifacts corrupt references. Localization teams verify that translated strings contain no bidi overrides or homoglyphs before shipping. And anyone who has ever stared at two "identical" strings that refuse to match finally has a one-click answer.
A final note on cleaning discipline: remove what you understand. Zero-width and direction-control characters are almost always safe to strip. Homoglyph replacement should stay opt-in when your text is legitimately multilingual — Cyrillic text is not an attack, it is a language. That is why GhostGlyph makes homoglyph cleaning a separate checkbox rather than a silent default: the tool shows you everything, and you decide.