Unicode Character Explorer
Search Unicode by code point, name or character, with the UTF-8, UTF-16 and HTML encodings of each.
Code points, encodings and why "length" lies
Three different things get called "a character", and conflating them causes most Unicode bugs.
A code point is a number assigned by the Unicode standard — U+0041 is A, U+1F600 is 😀. There are 1,114,112 possible code points, of which about 155,000 are assigned.
An encoding turns code points into bytes. UTF-8 uses 1–4 bytes per code point and is the correct default for essentially everything. UTF-16 uses 2 or 4 bytes and is what JavaScript, Java, C# and Windows use internally. UTF-32 uses a fixed 4 bytes and is rarely used outside of processing buffers.
A grapheme cluster is what a reader would call one character. This is where it comes apart: 👨👩👧👦 is one visible character, four emoji joined by three zero-width joiners — seven code points, 25 bytes in UTF-8, and length === 11 in JavaScript because it counts UTF-16 code units.
So "👨👩👧👦".length is 11, [...str].length is 7, and the answer a human would give is 1. Use Intl.Segmenter when you need the human answer — for truncating text, counting characters in a UI, or reversing a string without destroying it.
Unicode bugs
Two identical-looking strings compare unequal
Cause:Normalisation. é can be one code point (U+00E9) or two (e + combining acute U+0301). Both render identically; neither is wrong.
Fix:Normalise before comparing or storing: str.normalize("NFC") in JavaScript. NFC composes; NFD decomposes. macOS filesystems historically produced NFD, most other sources NFC — which is why filenames from a Mac often fail to match.
Truncating a string produces a replacement character
Cause:Cutting in the middle of a multi-byte sequence or a surrogate pair leaves half a character.
Fix:Truncate on grapheme cluster boundaries with Intl.Segmenter, not on byte or code-unit indices.
A username looks legitimate but is not
Cause:Homoglyphs. Cyrillic а (U+0430) is visually identical to Latin a (U+0061). This is the basis of IDN homograph attacks against domain names and impersonation in usernames.
Fix:Apply a confusable-detection or skeleton algorithm (UTS #39) to identifiers, and restrict them to a single script where possible.
Uppercasing a string changes its length
Cause:Case mapping is not one-to-one. German ß uppercases to SS, and Turkish has a dotted and dotless i with locale-specific rules.
Fix:Never assume case conversion preserves length. For case-insensitive comparison use toLocaleLowerCase with the right locale, or a proper case-folding routine.
Text displays right-to-left unexpectedly
Cause:An unbalanced bidirectional control character. These are invisible and can reorder rendered text without changing the underlying bytes — the basis of the "Trojan Source" attack, where source code renders differently than it compiles.
Fix:Strip or flag U+202A–U+202E and U+2066–U+2069 in untrusted input, especially in code, filenames and identifiers.
About
The Unicode Lookup tool lets you explore characters from across the Unicode standard. Search by name (e.g. "snowflake") or code point (e.g. U+2744), or paste any character to see its full metadata: Unicode code point, character name, block, category, UTF-8 bytes, HTML entity codes, and escape sequences for JavaScript and CSS.
How to use
- 1 Type a character name or code point in the search box (e.g. "heart" or "U+2764").
- 2 Alternatively, paste any character into the Inspect panel.
- 3 The tool shows code point, name, block, UTF-8 bytes, and HTML entities.
- 4 Click Copy to copy the character or its code to your clipboard.
- What is a Unicode code point?
- A Unicode code point is a unique number assigned to every character in the Unicode standard, written as U+ followed by a hexadecimal number. For example, U+0041 is the Latin capital letter A, U+1F600 is the grinning face emoji 😀. There are over 149,000 characters assigned across 168 scripts in Unicode 15.
- How do I find the Unicode code point of a character I have copied?
- Paste the character into the Inspect panel. The tool will immediately display its Unicode code point (e.g. U+2665), official name (e.g. BLACK HEART SUIT), block (e.g. Miscellaneous Symbols), UTF-8 byte sequence, HTML entity, and JavaScript/CSS escape sequence.
- What is the difference between UTF-8, UTF-16, and UTF-32?
- UTF-8, UTF-16, and UTF-32 are different ways of encoding Unicode code points as bytes. UTF-8 uses 1–4 bytes per character and is the dominant encoding for the web because ASCII characters (U+0000–U+007F) use just 1 byte, making English text compact. UTF-16 uses 2 or 4 bytes and is used internally by Windows, Java, and JavaScript strings. UTF-32 uses 4 bytes per character — simple but space-inefficient.
The full guide
More in Reference & Data
See all reference & data.