Skip to content
AI Watermark Remove

Remove invisible characters from any text

Finds every invisible character in your text, tells you what it is and where it is, and takes it out. It also keeps the invisible characters that real text needs.

0 characters
More options
Checking is free: 5 texts and 2 images a day, no signup.

Checking your text

    The characters this finds

    Zero-width family: U+200B zero-width space, U+200C zero-width non-joiner, U+200D zero-width joiner, U+2060 word joiner, U+FEFF byte-order mark. These render as nothing at all and are the most common carriers for hidden data in text.

    Unicode tag characters: U+E0000 to U+E007F. This block mirrors ASCII but renders as absolutely nothing, which means an entire readable message can be encoded in it and hidden inside an innocuous-looking sentence. If your text contains a run of these, someone put a payload in it.

    Variation selectors: U+FE00 to U+FE0F, plus U+E0100 to U+E01EF. These normally modify how a preceding character displays. Free-floating, with no base character in front of them, they are a known channel for encoding bytes.

    Bidirectional controls: U+202A to U+202E and the isolate characters. Invisible, and capable of reordering how text is displayed relative to how it is stored. Legitimate in mixed right-to-left text; suspicious in plain English prose.

    Private-use area: U+E000 to U+F8FF and the supplementary private planes. These have no standard meaning by definition, so they are only ever present because something deliberately put them there.

    Space homoglyphs: non-breaking, narrow no-break, thin, hair, en, em, ideographic spaces. Visible as whitespace but not the character a keyboard produces.

    Why a naive "delete all invisible characters" tool corrupts text

    Most tools in this category run a regular expression over the text and delete everything in the format category. That works fine on English prose and quietly destroys everything else, which is why it is worth explaining what this one does differently.

    The zero-width non-joiner is not decoration in Persian. It is orthography. "می‌روم" needs it; without it the word is wrong. The same applies to conjunct control in Devanagari and several other Indic scripts.

    The zero-width joiner is what holds a multi-person emoji together. Delete it from 👨‍👩‍👧 and you get three separate people instead of a family.

    Regional flag emoji are literally built out of tag characters, from the same U+E0020 block used to hide messages. A tool that strips all tag characters turns 🏴󠁧󠁢󠁳󠁣󠁴󠁿 into a plain black flag.

    Mongolian free variation selectors, Khmer inherent vowels, Hangul jamo fillers are all invisible, all load-bearing in their own scripts.

    This tool checks the surrounding context for each of these before deciding. A zero-width joiner between two emoji is kept; the same character floating between two Latin letters is removed. If you want the aggressive behaviour anyway, there is a checkbox for it. It is off by default, and it is off for a reason.

    Where invisible characters come from

    Deliberate marking is one source, and the one people arrive here worrying about. It is not the most common one.

    Copying from PDFs is a large source: PDF text extraction routinely inserts soft hyphens and zero-width spaces at line-break positions. Web pages contribute non-breaking spaces and word joiners used for typographic control. Google Docs and Notion add their own, as do most rich-text editors. Email clients add more. Translation and transliteration tools add bidi marks.

    Stray invisible characters are a common and easily confirmed explanation when a document behaves strangely: a find-and-replace that will not match, a word that will not break correctly, a checker flagging text you genuinely wrote.

    Questions

    How do I see invisible characters without a tool?
    Paste the text into a hex editor, or into a code editor with "render whitespace" and "highlight non-ASCII" turned on. Most word processors will not show them at all. The preview in this tool renders every one as a labelled chip in place, which is the same idea with less setup.
    Does removing them change my visible text?
    No. By definition these characters have no visual representation, so removing them leaves the rendered text identical. The one exception is space homoglyphs, which become ordinary spaces. They look the same but are a different underlying character.
    Why did it keep some characters it flagged?
    Because they are doing legitimate work in their script. The report lists everything it found; the cleaner preserves the subset that real text depends on: emoji joiners, script joiners in Persian or Indic text, complete flag sequences, right-to-left marks. You can override this with the aggressive options.
    Is there a character limit?
    Two thousand characters per free check, five checks a day. A pass raises that to two hundred thousand characters with no daily limit, and is what gives you the cleaned text.

    Related tools