Inspect Unicode · browser-local
Zero-Width Character Detector
Detect zero-width spaces, joiners, and other invisible characters that can hide in pasted text. GlyphSift lists each one with its code point and position so you can review before cleaning.
- Index state
- eligible
- Reviewed
- 2026-08-24
- Input limit
- 5,000 graphemes
Zero-Width Character Detector
U+200BOffset 7Common · Non-ASCII · Zero-width · InvisibleU+200DOffset 14Inherited · Non-ASCII · Zero-width
Good fit
Use this tool when
- Text behaves oddly in search or validation.
- You suspect hidden characters after copying.
- You want to audit content for invisible marks.
Keep the original
Avoid it when
- You need full per-character inspection with scripts and categories.
- You want to also flag bidirectional controls.
- You are generating text rather than checking it.
Reviewed truth vectors
Examples that expose the edge cases
visiblehidden1 zero-width character found at offset 7A zero-width space sits between the words.
plain text0 foundOrdinary text reports nothing.
ab1 zero-width character foundA zero-width joiner is detected.
Transparent implementation
How it works
- 01
Inspect each character and its code point.
- 02
Flag the reviewed zero-width and invisible ranges.
- 03
List each match with its position for review.
Known limitations
What the result cannot promise
It reports a reviewed set of code points, not every possible invisible character.
It does not delete characters; it reports them.
Some zero-width joiners are legitimate in emoji and scripts.
Questions before copying
Frequently asked questions
Are zero-width characters always bad?
No. Joiners are essential in emoji and some scripts; the detector reports them so you can decide.
Does it remove them?
No. It only locates them. Use the Invisible Character Detector for a safer-text version.
Can it prove text is clean?
It checks a reviewed set of code points, so treat a zero result as no reviewed marks found, not a guarantee.
Experience, expertise & trust
How we verify this tool
Automated evidence
- Tool-contract & coverage suite30 deterministic cases
tests/tools-30.test.mjs mirrors the ToolRunner dispatch and asserts every registered engineId returns the contracted output shape, plus a coverage guard so no tool silently drops characters.
Run in: node --test after a production build (vinext build) - Rendered-HTML suite12 deterministic cases
tests/rendered-html.test.mjs renders the deployed server bundle and asserts the Unicode-version manifest and each wave's tool markup are present in the server-rendered HTML.
Run in: node --test against the built dist/server bundle - Unicode inspection suite11 deterministic cases
tests/unicode-inspection.test.mjs verifies grapheme/code-point/byte counting and hidden-control detection using explicit \u escapes for combining and bidirectional characters.
Run in: node --test against the runtime's Unicode data - Compatibility risk suite13 deterministic cases
tests/compatibility.test.mjs checks that bidirectional controls, invisible characters, mixed scripts, and NFKC-changing input raise the documented risk status, and that safe-text stripping preserves ordinary content.
Run in: node --test, deterministic analyzer
Standards this tool follows
- UTS #39: Unicode Security Mechanisms
Confusable and mixed-script detection methodology.
- UAX #9: Unicode Bidirectional Algorithm
Bidirectional control characters flagged during inspection.
- UAX #15: Unicode Normalization Forms
NFC/NFKC normalization comparisons.
- RFC 3629: UTF-8
Byte-length counting for the UTF-8 encoding.