Free · runs in your browser
Invisible Character Remover
Paste text to see every invisible character the cleaner would change, listed by code point, name and position. Cleaning runs entirely in your browser: nothing is uploaded, nothing is charged, and the visible wording is left exactly as it is.
Runs in your browser · nothing uploaded
Findings
Every invisible character the cleaner would change is listed by name, code point and position.
Free and unlimited.
Need the statistical layer too? A token-choice watermark is not made of characters, so it needs the full rewrite instead.
How this works
Deterministic marks can be removed exactly. Probabilistic patterns can only be reduced. Simple Unmark keeps the two separate and does not promise detector outcomes.
- This tool is deterministic and local. The scan and the cleanup both run in your browser, so the text never leaves your device and no account or credit is needed.
- It reports each code point individually — the character, its U+ value, its Unicode name and where it occurs — so you can decide what to remove instead of trusting a black box.
- Zero-width joiners and non-joiners are preserved in valid emoji and same-script contexts, because deleting them there damages text in scripts such as Arabic, Persian, Hindi and Malayalam. Floating or malformed joiners can still be removed as hidden carriers.
Three steps
- 1
Paste or type your text. The scan updates as you type, with no request sent anywhere.
- 2
Review the listed code points. Each row names the character and shows how many times it occurs and where.
- 3
Copy the cleaned text. Only invisible characters change; every visible character stays as it was.
Worked example
Before
user[U+200B]name[U+00AD] = [U+00A0]"value"
After
username = "value"
A zero-width space, a soft hyphen and a non-breaking space removed or normalised. This is why pasted identifiers and config values fail validation while looking perfectly correct on screen.
Scope
What this page can and cannot do
Can
- List every covered invisible character by code point, name, count and position
- Remove them locally, in your browser, with no upload and no account
- Normalise non-breaking and typographic spaces to plain spaces
- Leave the visible wording completely unchanged
Cannot
- Tell you which tool or model inserted a character — presence is not provenance
- Detect a statistical watermark, which is not made of characters at all
- Fix a token-choice watermark from Gemini or Claude; that needs the full rewrite instead
- Guess intent: a zero-width joiner may be essential to your text, which is why it is preserved by default
Submitted content and cleaned output are not stored in our application database, and no content is sent to analytics. For rewrites, Private mode routes plaintext through the application, its load balancer, and the processors; Confidential mode encrypts browser-to-workload so our web backend receives metadata only, while DeepInfra still performs text rewrites. Deterministic inspection on the invisible character remover runs entirely in your browser. See the privacy policy and methodology.
Coverage
Every character this tool handles
Published so you can check it rather than trust it. Context matters: joiners, selectors, flag tags and directional controls are preserved in valid emoji, script and layout sequences, but removed when they float as hidden carriers.
Removed (45)
U+00AD | Soft hyphen |
U+034F | Combining grapheme joiner |
U+115F | Hangul choseong filler |
U+1160 | Hangul jungseong filler |
U+17B4 | Khmer vowel inherent AQ |
U+17B5 | Khmer vowel inherent AA |
U+180B | Mongolian free variation selector one |
U+180C | Mongolian free variation selector two |
U+180D | Mongolian free variation selector three |
U+180E | Mongolian vowel separator |
U+180F | Mongolian free variation selector four |
U+200B | Zero width space |
U+200C | Zero width non-joiner |
U+200D | Zero width joiner |
U+202A | Left-to-right embedding |
U+202B | Right-to-left embedding |
U+202C | Pop directional formatting |
U+202D | Left-to-right override |
U+202E | Right-to-left override |
U+2060 | Word joiner |
U+2061 | Function application |
U+2062 | Invisible times |
U+2063 | Invisible separator |
U+2064 | Invisible plus |
U+2065 | Reserved format control |
U+206A | Inhibit symmetric swapping |
U+206B | Activate symmetric swapping |
U+206C | Inhibit Arabic form shaping |
U+206D | Activate Arabic form shaping |
U+206E | National digit shapes |
U+206F | Nominal digit shapes |
U+3164 | Hangul filler |
U+E000 | Private-use character |
U+FDD0 | Unicode noncharacter |
U+FE00 | Variation selector one |
U+FE0F | Variation selector sixteen |
U+FEFF | Zero width no-break space |
U+FFA0 | Halfwidth Hangul filler |
U+FFF0 | Reserved default-ignorable code point |
U+FFF9 | Interlinear annotation anchor |
U+FFFA | Interlinear annotation separator |
U+FFFB | Interlinear annotation terminator |
U+E0000 | Reserved tag code point |
U+E0080 | Reserved tag-block code point |
U+E01F0 | Reserved variation-selector code point |
Normalised to a plain space (16)
U+00A0 | No-break space |
U+1680 | Ogham space mark |
U+2000 | En quad |
U+2001 | Em quad |
U+2002 | En space |
U+2003 | Em space |
U+2004 | Three-per-em space |
U+2005 | Four-per-em space |
U+2006 | Six-per-em space |
U+2007 | Figure space |
U+2008 | Punctuation space |
U+2009 | Thin space |
U+200A | Hair space |
U+202F | Narrow no-break space |
U+205F | Medium mathematical space |
U+3000 | Ideographic space |
The cleaner also covers tag characters, private-use ranges, all 66 Unicode noncharacters, supplementary variation selectors and reserved default-ignorable ranges. Complete subdivision-flag tag sequences and other load-bearing controls are preserved contextually.
Questions
About invisible character remover
Sources
- UTR #36: Unicode Security ConsiderationsUnicode Consortium · first-party
- UAX #9: Unicode Bidirectional AlgorithmUnicode Consortium · first-party
- UAX #15: Unicode Normalization FormsUnicode Consortium · first-party
- Is this really free?
- Yes, and unlimited. The scan and cleanup are plain JavaScript running locally, so there is no per-request cost to pass on. Credits apply only to the model-backed rewrite, which is a separate tool.
- Does the visible text change?
- No. This tool only touches invisible characters and unusual spaces. If you also want the wording rewritten to address a statistical watermark, use the AI watermark remover instead.
- Why can hidden characters break things?
- Because software compares bytes, not appearances. A zero-width space inside an identifier, URL, password field or code sample makes two visually identical strings unequal, which surfaces as a validation error with no visible cause.
- Do invisible characters prove text is AI-generated?
- No. They are inserted by web pages, editors, PDF exports and chat clients for ordinary layout reasons. Treating them as an AI fingerprint is a common and unfounded claim.
Read the evidence
Guides behind this tool
- Hidden Unicode vs Statistical Text WatermarksThe two mechanisms confused most often: invisible Unicode characters versus keyed token-choice watermarks. What each one is, what removes it, and what neither proves.
- How AI Text Watermarks WorkHow hidden-character marks and statistical token watermarks differ, how detection works, and why removal claims should always be bounded.
- AI Watermarks vs AI Detectors vs Provenance MetadataThree different things routinely confused: keyed watermarks added at generation, statistical AI detectors that guess, and C2PA metadata attached to files.
Other cleaners
- AI Watermark RemoverText only · free to try
- Gemini Watermark RemoverSynthID Text · documented
- SynthID Watermark RemoverMechanism-specific
- Claude Watermark RemoverDocumented as of August 2026
Need more than three cleans?
Private text starts at 0.1 credit per 100 words; Confidential mode uses 2× credits. Credits never expire, there is no subscription, and accounts unlock up to 5,000 words per clean.
See pricing