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
6 graphemes12 code points31 bytes
Live result

Unicode Character Inspector

GlyphCode pointScriptBytesFlags
cU+0063offset 0LatinLetter1
aU+0061offset 1LatinLetter1
fU+0066offset 2LatinLetter1
éU+00E9offset 3LatinLetter2Non-ASCII
U+0020offset 4CommonSeparator1
👨U+1F468offset 5CommonSymbol4Non-ASCII
U+200Doffset 7InheritedFormat3Non-ASCII, Zero-width
👩U+1F469offset 8CommonSymbol4Non-ASCII
U+200Doffset 10InheritedFormat3Non-ASCII, Zero-width
👧U+1F467offset 11CommonSymbol4Non-ASCII
U+200Doffset 13InheritedFormat3Non-ASCII, Zero-width
👦U+1F466offset 14CommonSymbol4Non-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.
01

Reviewed truth vectors

Examples that expose the edge cases

Inputé
OutputU+00E9 · Latin · 2 bytes

A precomposed accented letter.

Inpute◌́
OutputU+0065 + U+0301

A base letter plus combining acute accent.

Input😀
OutputU+1F600 · Common · 4 bytes

One code point but two UTF-16 units.

02

Transparent implementation

How it works

  1. 01

    Iterate the string by Unicode code point rather than UTF-16 unit.

  2. 02

    Record the code-unit offset and UTF-8 byte length.

  3. 03

    Classify script/category and attach high-signal risk flags.

03

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.

04

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.

05

Experience, expertise & trust

How we verify this tool

GlyphSift EditorialText-engine authors & reviewers

The GlyphSift Editorial team designs the deterministic text engine, writes each tool's examples against real Unicode edge cases, and reviews every claim before a page becomes eligible for indexing. We build and test the software we document; we do not outsource the copy to generic content mills.

Each tool page is reviewed against the same six input classes the engine is tested with — ASCII, emoji, combining marks, non-Latin scripts, empty input, and 5,000-grapheme input — and cannot become eligible if it is only a parameter variation of another page.

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