Three tabs. Inspect text splits whatever you paste into the characters a reader sees (grapheme clusters, using the browser's Intl.Segmenter) and each of those into its code points, with the code point's name, general category, block, UTF-8 bytes and UTF-16 code units, plus HTML and JavaScript escapes. It counts the text four ways and shows it in the four normalization forms. Find a character searches by name, by code point (U+20AB, 1F600) or by the character itself. Emoji is a picker with the nine emoji groups, a skin-tone selector and a name filter; clicking an emoji copies it and adds it to a field you can copy as a whole.
Four ways to count "one character"
Take the facepalm emoji with a medium skin tone, 🤦🏽♂️. You see one character. It is five code points: U+1F926 FACE PALM, U+1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4, U+200D ZERO WIDTH JOINER, U+2642 MALE SIGN and U+FE0F VARIATION SELECTOR-16. Two of those are outside the Basic Multilingual Plane and take two UTF-16 units each, so JavaScript's "🤦🏽♂️".length is 7. Stored as UTF-8 it is 17 bytes (4 + 4 + 3 + 3 + 3). All four numbers are correct; they answer different questions:
- Grapheme clusters: what a person counts and what the cursor jumps over. Use them for "max 280 characters" limits and for truncating text without cutting an emoji or an accent in half.
- Code points: what Unicode assigns names and properties to.
- UTF-16 units: what
length, slice and substring count in JavaScript, Java and C#. - UTF-8 bytes: what a database column, a file or a network packet stores.
Vietnamese shows the same effect with letters: "ệ" can be one code point (U+1EC7) or three (e, U+0323 combining dot below, U+0302 combining circumflex). Both look identical and are the same grapheme.
Normalization: NFC, NFD, NFKC, NFKD
Because one letter can be written several ways, Unicode defines normal forms. NFC composes (one code point for "ệ" where one exists) and is what the web and most databases expect. NFD decomposes into base letter plus combining marks, in a fixed order (dot below before circumflex). NFKC and NFKD also replace "compatibility" characters with plain ones: the ligature fi becomes "fi", a superscript ² becomes "2", fullwidth A becomes "A". Compare strings after normalizing them to the same form, and use NFKC for search keys and usernames, never for text you will show unchanged.
Emoji, skin tones and what is included
The emoji list is the complete set of fully-qualified emoji in Emoji 16.0 (September 2024) with their CLDR short names, in the standard order. Newer emoji (Emoji 17.0 from September 2025, and later) are not in the list: many phones and computers cannot display them yet. They are still inspected and counted correctly when you paste them. Skin tones apply the five Fitzpatrick modifiers to every emoji that accepts one; sequences with two different tones (such as a couple with mixed skin tones) are not reachable from the picker. Flags are pairs of regional indicator letters (🇻🇳 is V + N).
Character names come from the Unicode Character Database 18.0 for about 4,900 common characters: Latin (with all of Vietnamese), Greek, Cyrillic, punctuation, currency, arrows, mathematical operators, box drawing, symbols, kana, and the main emoji blocks. CJK ideographs and Hangul syllables get their names computed, as the standard defines them. Characters outside that subset still show their code point, block and category, with "name not in the bundled table". Categories come from your browser's own Unicode tables. The article code points vs graphemes vs bytes explains the counting with examples, and the HTML entity encoder turns characters into references.