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.
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.