How Unicode and Emoji Work
Eight concepts that explain almost every surprising thing an emoji does. Each one has a real example you can open in the Inspector and take apart yourself, rather than a diagram to take on trust.
What is a code point?
A code point is the number Unicode assigns to one character, written U+ followed by hexadecimal digits.
Every character in the standard has exactly one, and it never changes. A code point is not a byte and not a keystroke — it is the character's identity, independent of how it is stored or drawn.
Full definition: Code point
What is a grapheme cluster?
A grapheme cluster is the group of code points a reader perceives as a single character.
This is why character counts disagree. A family emoji looks like one character, is seven code points, and is eleven UTF-16 units. Software that splits text by code point will cut an emoji in half; splitting by grapheme cluster does not.
Full definition: Grapheme cluster
UTF-8 and UTF-16
These are two ways of storing code points as bytes. UTF-8 uses one to four bytes per code point; UTF-16 uses one or two 16-bit units.
The web is overwhelmingly UTF-8. JavaScript strings are UTF-16, which is why String.length reports 2 for a single emoji — it is counting units, not characters.
Full definition: UTF-8
What is a zero-width joiner?
ZWJ (U+200D) is an invisible character that asks the font to merge the emoji on either side of it into one picture.
If the font has a combined glyph, you see one image. If it does not, you see the parts side by side. Neither result is a bug — the fallback is designed into the standard.
Full definition: Zero width joiner (ZWJ)
What is a variation selector?
VS15 and VS16 request the text or emoji appearance of a character that has both forms.
Older symbols such as ❤ predate emoji and can be drawn either way. Adding U+FE0F asks for colour; U+FE0E asks for monochrome. Only characters Unicode lists as having both forms respond to this.
Full definition: Variation selector
How do flags work?
A flag is two regional indicator letters matching an ISO region code — there is no single flag code point.
That is why an unsupported flag shows as two letters: the device is drawing exactly what is there, having no combined artwork for the pair.
Full definition: Regional indicator
How do skin tones work?
A modifier character (U+1F3FB–U+1F3FF) follows a supported emoji and selects one of five tones.
Only around 330 entries accept one. Applying a modifier to anything else leaves the base emoji followed by a visible colour swatch, which is almost never what was intended.
Full definition: Skin tone modifier
What is a combining character?
A combining character attaches to the character before it instead of taking its own space.
Accents work this way, and so does "glitch" text — which is simply dozens of combining marks stacked on ordinary letters. Screen readers announce every one of them.
Full definition: Combining character
Where to go next
- Glossary — precise definitions of every term used here.
- Unicode Inspector — take any string apart.
- Developer data — the dataset behind this site, downloadable.
- Guides — practical how-tos rather than concepts.
Written by SymbolTap Editorial from the Unicode standard. Last reviewed 31 July 2026.
Frequently asked questions
Do I need to understand this to use emojis?
No. This is for the moments when something goes wrong — an emoji splits into pieces, a character count disagrees with a platform, or a string will not match. Each concept here explains one of those.
Is this material accurate to the current standard?
It describes Unicode 17.0.0 and CLDR 48.2.0, which is the data this site is built from. Concepts like code points and ZWJ have been stable for many releases.
Can I use these examples in a class?
Yes. The pages are free to read and print, and the Inspector needs no sign-up. Category and glossary pages have print styles that drop navigation and buttons.