Inspect Unicode · browser-local
Unicode Character Inspector
See what a string is actually made of. The inspector separates code points from visible graphemes and flags non-ASCII, combining, zero-width, invisible, and bidirectional controls.
- Index state
- eligible
- Reviewed
- 2026-08-24
- Input limit
- 5,000 graphemes
Unicode Character Inspector
| Glyph | Code point | Script | Bytes | Flags |
|---|---|---|---|---|
| c | U+0063offset 0 | LatinLetter | 1 | — |
| a | U+0061offset 1 | LatinLetter | 1 | — |
| f | U+0066offset 2 | LatinLetter | 1 | — |
| é | U+00E9offset 3 | LatinLetter | 2 | Non-ASCII |
U+0020offset 4 | CommonSeparator | 1 | — | |
| 👨 | U+1F468offset 5 | CommonSymbol | 4 | Non-ASCII |
| | U+200Doffset 7 | InheritedFormat | 3 | Non-ASCII, Zero-width |
| 👩 | U+1F469offset 8 | CommonSymbol | 4 | Non-ASCII |
| | U+200Doffset 10 | InheritedFormat | 3 | Non-ASCII, Zero-width |
| 👧 | U+1F467offset 11 | CommonSymbol | 4 | Non-ASCII |
| | U+200Doffset 13 | InheritedFormat | 3 | Non-ASCII, Zero-width |
| 👦 | U+1F466offset 14 | CommonSymbol | 4 | Non-ASCII |
Good fit
Use this tool when
- Two strings look identical but compare differently.
- A copied value fails validation or search.
- You need code-point and byte-level evidence.
Keep the original
Avoid it when
- You only need a quick prose cleanup.
- You expect authoritative Unicode character names in V1.
- You are using the output as a security guarantee.
Reviewed truth vectors
Examples that expose the edge cases
éU+00E9 · Latin · 2 bytesA precomposed accented letter.
e◌́U+0065 + U+0301A base letter plus combining acute accent.
😀U+1F600 · Common · 4 bytesOne code point but two UTF-16 units.
Transparent implementation
How it works
- 01
Iterate the string by Unicode code point rather than UTF-16 unit.
- 02
Record the code-unit offset and UTF-8 byte length.
- 03
Classify script/category and attach high-signal risk flags.
Known limitations
What the result cannot promise
V1 categories are readable families, not complete General_Category values.
Confusable detection is curated rather than exhaustive.
Grapheme boundaries and code-point rows answer different questions.
Questions before copying
Frequently asked questions
Why is an emoji two UTF-16 units?
JavaScript stores supplementary code points as a surrogate pair, even though the pair represents one code point.
What is a combining mark?
It modifies a preceding base character and may be part of the same user-perceived grapheme.
Does Non-ASCII mean dangerous?
No. Most world languages and emoji are non-ASCII. The label is descriptive, not a verdict.
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.