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.
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.
[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.| Kind | Characters | Default |
|---|---|---|
| Bidirectional controls | LRE, 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 spaces | ZWSP (U+200B), word joiner (U+2060), Mongolian vowel separator (U+180E) | Remove |
| Zero-width joiners | ZWJ (U+200D) and ZWNJ (U+200C) outside emoji | Remove |
| Byte order mark | U+FEFF (BOM at the start, ZWNBSP elsewhere) | Remove |
| Soft hyphens | U+00AD | Remove |
| Unusual spaces | NBSP (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 space | Ideographic space U+3000 (全角スペース) | Keep |
| Unicode line breaks | Line separator (U+2028), paragraph separator (U+2029), NEL (U+0085) | Replace with a newline |
| Stray variation selectors | VS1–VS256 (U+FE00–FE0F, U+E0100–E01EF) and Mongolian FVS that do not follow a character they can change | Remove |
| Tag characters | U+E0000–E007F outside a flag emoji | Remove |
| Inside emoji and variation sequences | ZWJ inside 👨👩👧, VS16 after an emoji, tags in subdivision flags, ideographic variation selectors after kanji | Keep |
| Blank-looking characters | Hangul fillers (U+115F, U+1160, U+3164, U+FFA0), Braille blank (U+2800) | Remove |
| Control characters | C0 and C1 controls except tab, line feed and carriage return | Remove |
| Other | Other 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.
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.
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.
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.
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.
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.
No. Everything runs in your browser.