belun.app Blog
RU

How Emoji Actually Work: Code Points, Skin Tones, Boxes

Why emoji look different on every device, how skin tones and joined sequences are built, and why one smiley can count as seven characters.

Hands typing a chat message on a smartphone screen with emoji in the keyboard

An emoji is a character. Same category of thing as the letter A, or a comma, or a Cyrillic ж. Once that clicks, most of the strange behaviour people run into stops being strange: the box instead of a smiley, the heart that turns pale on someone else’s phone, the family that falls apart into four separate people. The Emoji Picker copies those characters to your clipboard, and this is what happens to them afterwards.

Nobody agrees on what 😀 looks like

Unicode assigns the number. It does not draw the picture. U+1F600 means “grinning face” and that’s the whole specification. The rest is up to whoever made the font on your device.

Apple uses Apple Color Emoji. Android ships Noto Color Emoji. Windows has Segoe UI Emoji, which redrew almost every glyph in a flat 3D style in the Windows 11 update and annoyed a lot of people. Twitter built Twemoji, WhatsApp maintains its own set. So when you paste 😀 into a message, you are not sending a picture, you’re sending the number 128512, and the recipient’s phone draws whatever it thinks that means.

This is why the pistol emoji became a water gun. Apple switched its drawing in 2016, everyone else followed by 2018, and the underlying character never changed at all.

The empty box

A box, or a question mark in a diamond, means the font on the receiving end has no glyph for that code point. Almost always it’s an age problem. 🫠 (melting face) arrived with Unicode 14.0 in September 2021, so anything built before then — Windows 10, an Android phone stuck on version 11, a Smart TV browser — has nothing to draw.

The safe zone is anything from the original 2010 batch or Emoji 1.0 in 2015: 😀, ❤️, 👍, 🔥. If your emoji is going into a system you don’t control (an email subject line, a push notification, an SMS gateway), stay old.

Skin tone is a second character stuck on the end

Unicode 8.0 added five modifiers in 2015, based on the Fitzpatrick dermatology scale: U+1F3FB through U+1F3FF. They aren’t emoji on their own. You put one directly after a base character and the font merges the pair into a single glyph.

So 👍 (U+1F44D) plus U+1F3FD becomes 👍🏽. Two code points, one picture.

Only emoji showing human skin take a modifier — hands, single people, and the professions built from them. 🐶 doesn’t. Neither does 👪, which is why the picker leaves the swatches off those.

Why one smiley can weigh seven characters

Here’s where it gets ugly for anyone with a character limit.

Most emoji sit outside the Basic Multilingual Plane, so JavaScript stores them as two UTF-16 units. "😀".length returns 2, not 1. Add a skin tone and you’re at 4. And 👩‍💻 isn’t a character at all. It’s 👩 plus an invisible zero-width joiner (U+200D) plus 💻, which is three code points and five units.

The family 👨‍👩‍👧‍👦 is four people and three joiners: seven code points, eleven UTF-16 units, one picture.

The same arithmetic is why the Text Reverser splits on code points rather than UTF-16 units: a naive reversal would cut 😀 in half and hand back two meaningless surrogates.

X counts most emoji as 2 characters against the 280 limit. Instagram bios, SMS gateways, and database columns all count differently again. If a limit matters, paste the finished text into the Character Counter rather than trusting your eyes.

That zero-width joiner also explains the falling-apart problem. Strip U+200D — which plain-text fields and older SMS systems happily do — and 👩‍💻 becomes 👩💻. Two emoji, no warning. Single-code-point emoji never break this way, so for anything going through an unpredictable pipe, prefer 😀 over 🧑‍🚀.

If the destination is HTML and you’d rather not gamble on file encoding, run the character through the HTML Entity Encoder and paste 😀 instead.

Otherwise: open the Emoji Picker, type what you’re looking for, click once, paste.

Try the tool

Emoji Picker →