Unicode character and emoji lookup

Code points, names, UTF-8/UTF-16, graphemes, normalisation and an emoji picker.

Paste anything: each user-perceived character is broken down into its code points.

Characters you see
20
Code points
26
UTF-16 units (JS length)
30
UTF-8 bytes
53

Grapheme clusters

  1. T
    • U+0054 Name not in the bundled table
      Uppercase letter (Lu) · Basic Latin · UTF-8 54

    T · \u0054

  2. i
    • U+0069 Name not in the bundled table
      Lowercase letter (Ll) · Basic Latin · UTF-8 69

    i · \u0069

  3. ế
    • U+1EBF Name not in the bundled table
      Lowercase letter (Ll) · Latin Extended Additional · UTF-8 E1 BA BF

    ế · \u1EBF

  4. n
    • U+006E Name not in the bundled table
      Lowercase letter (Ll) · Basic Latin · UTF-8 6E

    n · \u006E

  5. g
    • U+0067 Name not in the bundled table
      Lowercase letter (Ll) · Basic Latin · UTF-8 67

    g · \u0067

  6. ␠
    • U+0020 Name not in the bundled table
      Space (Zs) · Basic Latin · UTF-8 20

      · \u0020

  7. V
    • U+0056 Name not in the bundled table
      Uppercase letter (Lu) · Basic Latin · UTF-8 56

    V · \u0056

  8. i
    • U+0069 Name not in the bundled table
      Lowercase letter (Ll) · Basic Latin · UTF-8 69

    i · \u0069

  9. ệ
    • U+1EC7 Name not in the bundled table
      Lowercase letter (Ll) · Latin Extended Additional · UTF-8 E1 BB 87

    ệ · \u1EC7

  10. t
    • U+0074 Name not in the bundled table
      Lowercase letter (Ll) · Basic Latin · UTF-8 74

    t · \u0074

  11. ␠
    • U+0020 Name not in the bundled table
      Space (Zs) · Basic Latin · UTF-8 20

      · \u0020

  12. 🤦🏽‍♂️
    • U+1F926 Name not in the bundled table
      Other symbol (So) · Supplemental Symbols and Pictographs · UTF-8 F0 9F A4 A6 · UTF-16 D83E DD26
    • U+1F3FD Name not in the bundled table
      Modifier symbol (Sk) · Miscellaneous Symbols and Pictographs · UTF-8 F0 9F 8F BD · UTF-16 D83C DFFD
    • U+200D Name not in the bundled table
      Format (Cf) · General Punctuation · UTF-8 E2 80 8D
    • U+2642 Name not in the bundled table
      Other symbol (So) · Miscellaneous Symbols · UTF-8 E2 99 82
    • U+FE0F Name not in the bundled table
      Non-spacing mark (Mn) · Variation Selectors · UTF-8 EF B8 8F

    🤦🏽‍♂️ · \u{1F926}\u{1F3FD}\u200D\u2642\uFE0F

  13. ␠
    • U+0020 Name not in the bundled table
      Space (Zs) · Basic Latin · UTF-8 20

      · \u0020

  14. 🇻🇳
    • U+1F1FB Name not in the bundled table
      Other symbol (So) · Enclosed Alphanumeric Supplement · UTF-8 F0 9F 87 BB · UTF-16 D83C DDFB
    • U+1F1F3 Name not in the bundled table
      Other symbol (So) · Enclosed Alphanumeric Supplement · UTF-8 F0 9F 87 B3 · UTF-16 D83C DDF3

    🇻🇳 · \u{1F1FB}\u{1F1F3}

  15. ␠
    • U+0020 Name not in the bundled table
      Space (Zs) · Basic Latin · UTF-8 20

      · \u0020

  16. é
    • U+0065 Name not in the bundled table
      Lowercase letter (Ll) · Basic Latin · UTF-8 65
    • U+0301 Name not in the bundled table
      Non-spacing mark (Mn) · Combining Diacritical Marks · UTF-8 CC 81

    é · \u0065\u0301

  17. ␠
    • U+0020 Name not in the bundled table
      Space (Zs) · Basic Latin · UTF-8 20

      · \u0020

  18. fi
    • U+FB01 Name not in the bundled table
      Lowercase letter (Ll) · Alphabetic Presentation Forms · UTF-8 EF AC 81

    fi · \uFB01

  19. ␠
    • U+0020 Name not in the bundled table
      Space (Zs) · Basic Latin · UTF-8 20

      · \u0020

  20. ₫
    • U+20AB Name not in the bundled table
      Currency symbol (Sc) · Currency Symbols · UTF-8 E2 82 AB

    ₫ · \u20AB

Normalization forms

NFC · 25 code points

Tiếng Việt 🤦🏽‍♂️ 🇻🇳 é fi ₫

NFD · 30 code points

Tiếng Việt 🤦🏽‍♂️ 🇻🇳 é fi ₫

NFKC · 26 code points

Tiếng Việt 🤦🏽‍♂️ 🇻🇳 é fi ₫

NFKD · 31 code points

Tiếng Việt 🤦🏽‍♂️ 🇻🇳 é fi ₫

What this tool does

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.

Frequently asked questions

Why is "🤦🏽‍♂️".length 7 in JavaScript?

length counts UTF-16 code units. The emoji is five code points; the face and the skin-tone modifier are above U+FFFF and need two units each, and the joiner, the male sign and the variation selector need one each: 2 + 2 + 1 + 1 + 1 = 7.

How do I count characters the way a person does?

Count grapheme clusters, for example with Intl.Segmenter in JavaScript ([...new Intl.Segmenter().segment(text)].length). Counting code points with [...text].length is closer but still splits emoji sequences and letters with combining accents.

Which normalization form should I use?

Store and compare text in NFC, which is what browsers and most systems produce. Use NFKC (often with case folding) for identifiers, search keys and usernames, so look-alike compatibility characters match. Use NFD when you want to strip accents by removing combining marks.

Why does a new emoji show as a box?

Your device's emoji font does not have it yet. Each Unicode version adds emoji, and operating systems add them to their fonts later. The picker lists Emoji 16.0 for that reason.

Why is a character's name missing?

To keep the page light, names are bundled for about 4,900 common characters, plus computed names for CJK ideographs and Hangul. Other characters show their code point, block and category, which you can look up in the Unicode code charts.