Complex emoji test values

Characters beyond the basic plane and composed sequences that break counting and truncation. 12 values, each with what it breaks and what a correct application does instead.

emoji-complex version 1.0, updated 2026-10-14 CC-BY-4.0

Type them one at a time with AltShiftN in the palette, or take them all into a script with nkb emit emoji-complex.

Family emoji built with joiners

emoji-complex/emoji-family-zwj
👨👩👧 👨\u200D👩\u200D👧
  • 2 zero-width characters
  • 1 grapheme
  • 5 code points
  • 18 bytes
  • 8 UTF-16 units
What it breaks
One image to the user, three characters plus two invisible joiners to the software; truncation cuts it into unrelated pictures.
What a correct application does
Counted and truncated as one unit, or rejected - never split between the joiners.

Emoji with a skin tone

emoji-complex/emoji-skin-tone
👍🏽 👍🏽
  • 1 grapheme
  • 2 code points
  • 8 bytes
  • 4 UTF-16 units
What it breaks
A base character plus a modifier: cutting between them changes the meaning of the value.
What a correct application does
Kept together by any truncation.

Keycap digit one

emoji-complex/emoji-keycap
1⃣ 1\uFE0F⃣
  • 1 zero-width character
  • 1 grapheme
  • 3 code points
  • 7 bytes
  • 3 UTF-16 units
What it breaks
A digit, a variation selector and a combining mark that together render as one key; the digit alone is a number.
What a correct application does
Preserved as a unit; not parsed as the number one.

Heart with a variation selector

emoji-complex/emoji-variation
❤ ❤\uFE0F
  • 1 zero-width character
  • 1 grapheme
  • 2 code points
  • 6 bytes
  • 2 UTF-16 units
What it breaks
The variation selector decides whether this renders as a picture or as text; stripping it silently changes the display.
What a correct application does
Preserved on save so the value looks the same after a round trip.

Country flag

emoji-complex/flag-country
🇵🇱 🇵🇱
  • 1 grapheme
  • 2 code points
  • 8 bytes
  • 4 UTF-16 units
What it breaks
A flag is two regional indicator characters; a field limited to two characters accepts it and one limited to one splits it.
What a correct application does
Treated as one unit for length limits.

Emoji inside a name

emoji-complex/emoji-in-middle
Jan😀Kowalski Jan😀Kowalski
  • 12 graphemes
  • 12 code points
  • 15 bytes
  • 13 UTF-16 units
What it breaks
A character outside the basic plane inside a name breaks storage configured for narrow encodings, often with a raw error.
What a correct application does
Stored intact, or rejected with a readable message.

Ideograph beyond the basic plane

emoji-complex/astral-cjk
𠮷 𠮷
  • 1 grapheme
  • 1 code point
  • 4 bytes
  • 2 UTF-16 units
What it breaks
A rare ideograph outside the basic plane: the same storage problem without looking like an emoji.
What a correct application does
Handled exactly like any other character.

Fifty emoji

emoji-complex/emoji-50
50 × 😀
  • 50 graphemes
  • 50 code points
  • 200 bytes
  • 100 UTF-16 units
What it breaks
Fifty characters to the user, two hundred bytes to storage; the mismatch between limits shows up here first.
What a correct application does
Limits stated in the same unit on both sides.

A single emoji

emoji-complex/emoji-only
😀 😀
  • 1 grapheme
  • 1 code point
  • 4 bytes
  • 2 UTF-16 units
What it breaks
A name or title consisting solely of a picture; sorting, initials and search all have to do something with it.
What a correct application does
Accepted and displayed, with sorting and initials behaving predictably.

Joiner with nothing to join

emoji-complex/zwj-orphan
JanKowalski Jan\u200DKowalski
  • 1 zero-width character
  • 11 graphemes
  • 12 code points
  • 14 bytes
  • 12 UTF-16 units
What it breaks
A joiner with nothing to join: invisible, meaningless, and enough to make two identical names different.
What a correct application does
Stripped on save, or preserved and revealed in the interface.

Emoji in a file name

emoji-complex/emoji-in-filename
report😀.txt report😀.txt
  • 11 graphemes
  • 11 code points
  • 14 bytes
  • 12 UTF-16 units
What it breaks
Archives, transfers and older file systems handle these names inconsistently.
What a correct application does
Stored and downloaded with the name intact, or rejected before the file is created.

A thousand emoji

emoji-complex/emoji-1000
1,000 × 😀
  • 1,000 graphemes
  • 1,000 code points
  • 4,000 bytes
  • 2,000 UTF-16 units
What it breaks
A thousand pictures: rendering, scrolling and every length counter at once.
What a correct application does
Accepted and clipped in the layout, or rejected with a stated limit.