BYTETOOLS

Unicode Character Inspector

Inspect any text character by character: Unicode code points, UTF-8 bytes, UTF-16 units, HTML entities, CSS and JS escapes, plus NFC, NFD, NFKC and NFKD forms.

9
Code points
10
UTF-16 units (.length)
17
UTF-8 bytes

Character breakdown

CharCode pointDecUTF-8UTF-16HTMLCSSJS
CU+004367430043C\000043\u{43}
aU+006197610061a\000061\u{61}
fU+0066102660066f\000066\u{66}
éU+00E9233C3 A900E9é\0000E9\u{e9}
SPACEU+002032200020 \000020\u{20}
😀U+1F600128512F0 9F 98 80D83D DE00😀\01F600\u{1f600}
SPACEU+002032200020 \000020\u{20}
U+4E2D20013E4 B8 AD4E2D中\004E2D\u{4e2d}
ZERO WIDTH SPACEU+200B8203E2 80 8B200B​\00200B\u{200b}

Per-character detail

CU+0043
BMP (Basic Multilingual Plane) · 1 UTF-8 byte · 1 UTF-16 unit
C · \u{43}
aU+0061
BMP (Basic Multilingual Plane) · 1 UTF-8 byte · 1 UTF-16 unit
a · \u{61}
fU+0066
BMP (Basic Multilingual Plane) · 1 UTF-8 byte · 1 UTF-16 unit
f · \u{66}
éU+00E9
BMP (Basic Multilingual Plane) · 2 UTF-8 bytes · 1 UTF-16 unit
é · \u{e9}
 U+0020SPACE
BMP (Basic Multilingual Plane) · 1 UTF-8 byte · 1 UTF-16 unit
  · \u{20}
😀U+1F600
SMP (Supplementary Multilingual Plane) · 4 UTF-8 bytes · 2 UTF-16 units (surrogate pair)
😀 · \u{1f600}
 U+0020SPACE
BMP (Basic Multilingual Plane) · 1 UTF-8 byte · 1 UTF-16 unit
  · \u{20}
U+4E2D
BMP (Basic Multilingual Plane) · 3 UTF-8 bytes · 1 UTF-16 unit
中 · \u{4e2d}
 U+200BZERO WIDTH SPACE
BMP (Basic Multilingual Plane) · 3 UTF-8 bytes · 1 UTF-16 unit
​ · \u{200b}

Unicode normalization

FormResultCode pointsUTF-16 unitsUTF-8 bytes
NFCCafé 😀 中​(unchanged)91017
NFDCafé 😀 中​101118
NFKCCafé 😀 中​(unchanged)91017
NFKDCafé 😀 中​101118

NFC composes characters where possible and NFD decomposes them, so é is either one code point or an e followed by a combining accent. The K forms additionally fold compatibility characters — the ligature becomes fi — which changes the text, so use them for search keys rather than for storage.

What is the Unicode Character Inspector?

Paste any text and this inspector splits it into real Unicode code points — not UTF-16 units — so emoji and other characters outside the Basic Multilingual Plane are shown as the single characters they actually are.

  • Splits text into true code points, so emoji count as one character
  • UTF-8 bytes, UTF-16 units and surrogate pairs shown per character
  • HTML numeric entities plus CSS \XXXXXX and JavaScript \u{...} escapes
  • Invisible and control characters named rather than silently rendered
  • All four normalization forms with their differing byte and unit lengths
  • Copy the whole breakdown as TSV, or any normalized form directly

How to use the Unicode Character Inspector

  1. 1

    Type or paste text into the input box.

  2. 2

    Read the summary counts: code points, UTF-16 units and UTF-8 bytes.

  3. 3

    Scan the breakdown table for each character's code point, UTF-8 bytes, UTF-16 units and escapes.

  4. 4

    Check the per-character cards for the Unicode plane and surrogate pair information.

  5. 5

    Compare the NFC, NFD, NFKC and NFKD rows, and copy whichever normalized form you need.

About the Unicode Character Inspector

Paste any text and this inspector splits it into real Unicode code points — not UTF-16 units — so emoji and other characters outside the Basic Multilingual Plane are shown as the single characters they actually are. For each one you get the U+ code point, decimal value, UTF-8 byte sequence, UTF-16 units, HTML numeric entity, and CSS and JavaScript escapes.

Invisible and control characters are labelled rather than rendered, which makes it straightforward to find a zero-width space, a soft hyphen, a non-breaking space or a stray byte-order mark that is breaking a comparison or a layout.

All four normalization forms are computed side by side with their code point, UTF-16 and byte lengths, so you can see exactly how NFC and NFD differ and where the compatibility forms change your text. Everything runs locally in your browser.

Frequently asked questions

Why does an emoji count as two characters in JavaScript?

Because JavaScript strings are sequences of UTF-16 units, and any code point above U+FFFF needs two of them — a surrogate pair. U+1F600 is stored as D83D DE00, so .length returns 2. Using Array.from or spreading the string gives you the single code point instead.

What is the difference between NFC and NFD?

NFC composes characters into their shortest form, so é is one code point. NFD decomposes them, so the same é becomes an e followed by a combining acute accent — two code points and three UTF-8 bytes instead of two. The text looks identical but will not compare as equal.

When should I use NFKC or NFKD?

Only for search keys and identifier matching. The compatibility forms fold characters that merely look similar, so the ligature fi becomes fi and superscripts become plain digits. That is useful for matching but lossy, so never store the result as your canonical text.

How do I find invisible characters in my text?

Paste it here and look for the labelled badges in the table. Zero-width spaces, zero-width joiners, soft hyphens, non-breaking spaces and byte-order marks are all named explicitly instead of being rendered as nothing.

How many bytes does a character take in UTF-8?

Between one and four. ASCII characters take one, most Latin and Greek letters take two, most CJK characters and symbols take three, and emoji and other supplementary-plane characters take four. The exact sequence is shown for every character.

Is my text sent anywhere?

No. Everything is computed with the browser's own text APIs inside your tab, so you can safely inspect passwords, tokens or personal data that is behaving strangely.

Related tools