Invisible Character Detector & Remover

Find zero-width spaces, no-break spaces, BOMs, soft hyphens, bidirectional controls and other invisible characters in text. Each one is shown as a badge such as [ZWSP] or [NBSP]. Choose for each kind whether to remove it, replace it with a normal space, or keep it, then copy the cleaned text. Emoji sequences and the Japanese full-width space are kept by default.

About this tool

What is the Invisible Character Detector & Remover?

Text copied from web pages, PDFs, chat apps and word processors often carries characters you cannot see: a zero-width space (U+200B) that makes two identical-looking words different, a no-break space (U+00A0) that breaks a CSV or a password, a byte order mark (U+FEFF) at the start of a file, or a soft hyphen (U+00AD) in the middle of a word. This tool finds them, shows each one as a visible badge, and removes or replaces them.

How to use

  1. Paste text into Input text.
  2. Highlighted shows the text with every invisible or unusual character replaced by a badge such as [ZWSP], [NBSP] or [BOM]. Hover a badge to see its code point and name. Red badges are removed, orange ones are replaced and grey ones are kept.
  3. Under What to do, choose Remove, Replace (with a normal space, or a newline for line separators) or Keep for each kind found.
  4. Copy or download the result from Cleaned text. The number of changes is shown above it.

What it finds

KindCharactersDefault
Bidirectional controlsLRE, RLE, PDF, LRO, RLO (U+202A–202E), LRI, RLI, FSI, PDI (U+2066–2069), LRM, RLM (U+200E, U+200F), ALM (U+061C)Remove
Zero-width spacesZWSP (U+200B), word joiner (U+2060), Mongolian vowel separator (U+180E)Remove
Zero-width joinersZWJ (U+200D) and ZWNJ (U+200C) outside emojiRemove
Byte order markU+FEFF (BOM at the start, ZWNBSP elsewhere)Remove
Soft hyphensU+00ADRemove
Unusual spacesNBSP (U+00A0), en/em and other spaces (U+2000–200A), narrow NBSP (U+202F), math space (U+205F), Ogham space (U+1680)Replace with a space
Full-width spaceIdeographic space U+3000 (全角スペース)Keep
Unicode line breaksLine separator (U+2028), paragraph separator (U+2029), NEL (U+0085)Replace with a newline
Stray variation selectorsVS1–VS256 (U+FE00–FE0F, U+E0100–E01EF) and Mongolian FVS that do not follow a character they can changeRemove
Tag charactersU+E0000–E007F outside a flag emojiRemove
Inside emoji and variation sequencesZWJ inside 👨‍👩‍👧, VS16 after an emoji, tags in subdivision flags, ideographic variation selectors after kanjiKeep
Blank-looking charactersHangul fillers (U+115F, U+1160, U+3164, U+FFA0), Braille blank (U+2800)Remove
Control charactersC0 and C1 controls except tab, line feed and carriage returnRemove
OtherOther format characters (Cf) and default-ignorable code points, such as invisible times (U+2062)Remove

Tabs, normal spaces and newlines (LF, CR LF) are left alone.

Trojan Source and hidden text

Bidirectional control characters change the order in which text is displayed, so code or a file name can look different from what it really is. This attack is known as Trojan Source (CVE-2021-42574). The tool shows a warning when the text contains any of them; in the highlighted view they are replaced by badges, so they cannot reorder what you see.

Tag characters (U+E0020–E007E) are invisible copies of ASCII and can carry hidden text, for example instructions aimed at an AI assistant. A run of variation selectors can also hide bytes after a single emoji. When the text contains either, the tool shows what they spell out, as plain text.

Emoji and grapheme clusters

The zero-width joiner and variation selectors are also part of emoji. 👨‍👩‍👧 is three emoji joined by ZWJ, and VS16 (U+FE0F) makes ❤ a red emoji heart. Characters that sit inside an emoji or a variation sequence are counted as Inside emoji and variation sequences and kept by default. The tool uses Intl.Segmenter to find grapheme clusters, so a ZWJ inside an emoji is kept while a stray ZWJ between two letters is removed.

FAQ

Why is the full-width space kept?

Japanese, Chinese and Korean text uses the ideographic space (U+3000) on purpose, for example to indent paragraphs. Set Full-width space to Replace if you want normal spaces instead.

Will removing ZWNJ / ZWJ break some languages?

Persian, Kurdish and some Indic scripts use ZWNJ and ZWJ between letters to control how they join. ZWJ inside an Indic conjunct is kept, but ZWNJ between Persian letters is counted as a stray joiner. Set Zero-width joiners (outside emoji) to Keep for such text.

Why does the cleaned text still contain a variation selector?

A variation selector that follows a character it can change (VS16 after an emoji, an ideographic variation selector after a kanji) is part of how that character looks, so it is kept by default. Only extra or stray selectors are removed.

Is my text sent anywhere?

No. Everything runs in your browser.

🎭 Confusable / Homoglyph Checker
Check a user name, domain, URL or identifier for look-alike characters such as Cyrillic а in “pаypal”. Shows each character's script, what it looks like, mixed-script words and the Punycode form of a domain.
🔤 Unicode Normalization
Normalize text to Unicode NFC, NFD, NFKC or NFKD as you type. Convert full-width letters and half-width katakana, and unify accented characters.
🔡 Unicode Escape / Unescape
Convert text to \uXXXX Unicode escape sequences, or turn \uXXXX and \u{1F600} escapes back into readable characters. Handles emoji and surrogate pairs.
🔤 Character Counter
Count characters, words, lines, paragraphs, sentences and bytes (UTF-8 and Shift_JIS) as you type. Emoji and combining marks count as one character, and Japanese words are counted too.
📊 Text File Diff
Compare two text files in your browser and see added, removed and changed lines highlighted in a split or unified view. Files are never uploaded.
🔍 Unicode Character Inspector
Paste text to see every character: code point (U+XXXX), Unicode name, general category, block, script, UTF-8 bytes and UTF-16 code units. Invisible characters such as zero-width spaces, control characters and combining marks are made visible.