Unicode Emoji Properties: Extended_Pictographic, Emoji_Presentation, and More

UnicodeUnicode
Standard universel d'encodage des caractères qui attribue un numéro unique à chaque caractère de tous les systèmes d'écriture et ensembles de symboles, y compris les emoji.
EmojiEmoji
Mot japonais (絵文字) signifiant 'caractère image' — petits symboles graphiques utilisés dans la communication numérique pour exprimer des idées, des émotions et des objets.
Properties

Unicode assigns named properties to every code point, and emoji have a dedicated set defined in Unicode Standard Annex #51. These properties are the authoritative source for deciding whether a character is an emoji, how it should be displayed, and how it interacts with other characters.

Understanding these properties is essential for building correct emoji parsers, validators, and renderers.

The Six Core Emoji Properties

1. Emoji

The broadest property. A code point has Emoji=Yes if it can be used as an emoji. This includes characters that are also used as ordinary text symbols.

U+0023  # NUMBER SIGN          Emoji=Yes (part of # keycap)
U+00A9  © COPYRIGHT SIGN       Emoji=Yes
U+1F600 😀 GRINNING FACE       Emoji=Yes

About 1,400+ code points have Emoji=Yes. The Emoji property alone is too broad for most detection tasks because it includes digits, common punctuation, and symbols that usually appear as plain text.

2. Emoji_Presentation

A code point has Emoji_Presentation=Yes if it is displayed as a color emoji by default — without requiring a variation selector. This is the property most commonly used to answer "is this character normally shown as an emoji?"

U+1F600 😀  Emoji_Presentation=Yes  (emoji by default)
U+0023  #   Emoji_Presentation=No   (text by default, needs U+FE0F for emoji)
U+00A9  ©   Emoji_Presentation=No   (text by default)

Approximately 1,200 code points have Emoji_Presentation=Yes.

3. Emoji_Modifier

Marks the five skin tone modifier characters (Fitzpatrick scale):

Code Point Character Tone
U+1F3FB 🏻 Light
U+1F3FC 🏼 Medium-Light
U+1F3FD 🏽 Medium
U+1F3FE 🏾 Medium-Dark
U+1F3FF 🏿 Dark

These characters have no standalone appearance; they only make sense immediately following an Emoji_Modifier_Base character.

4. Emoji_Modifier_Base

A code point has Emoji_Modifier_Base=Yes if it can be followed by a skin tone modifier to create a modified sequence. Examples include 👋 (waving hand), 🖐 (hand with fingers splayed), and 🧑 (person).

# Checking modifier base + modifier sequence
base = "\U0001F44B"    # 👋
modifier = "\U0001F3FD"  # 🏽 Medium skin tone
combined = base + modifier
print(combined)  # 👋🏽

Not all person-like emoji are modifier bases. 👻 (ghost) and 🤖 (robot) are not modifier bases because they are not human-like enough.

5. Emoji_Component

A code point that can appear as part of an emoji sequence but is not itself an emoji when standalone. This includes:

  • Skin tone modifiers (U+1F3FB–U+1F3FF)
  • ZWJJointure sans chasse (ZWJ)
    Caractère Unicode invisible (U+200D) utilisé pour combiner plusieurs emoji en un seul emoji composite, comme l'assemblage de personnes et d'objets pour former des emoji de professions.
    (U+200D)
  • Variation selectors (U+FE0E, U+FE0F)
  • Combining Enclosing Keycap (U+20E3)
  • Tag characters (U+E0020–U+E007F) used in subdivision flags
  • Regional Indicator letters (U+1F1E0–U+1F1FF)

Emoji_Component=Yes does not imply the character is itself an emoji — ZWJ is a joining control character, not an emoji.

6. Extended_Pictographic

The most useful property for comprehensive emoji detection. It covers:

  • All code points with Emoji_Presentation=Yes
  • Reserved code points in emoji blocks (for future emoji)
  • Additional pictographic symbols
Extended_Pictographic ⊃ Emoji_Presentation

Using Extended_Pictographic in a regex ensures your code will not break when new emoji are added to existing Unicode blocks, because those blocks are already reserved.

Accessing Property Data

From the Unicode Character Database

The official source is emoji-data.txt in the Unicode UCD:

# Download the latest data file
curl -O https://unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt

# View Extended_Pictographic ranges
grep "Extended_Pictographic" emoji-data.txt | head -20

Sample output:

00A9          ; Emoji                # 1.1  [1] (©️)
00AE          ; Emoji                # 1.1  [1] (®️)
203C          ; Emoji                # 1.1  [1] (‼️)
...
1F600         ; Emoji                # 6.1  [1] (😀)
1F600         ; Emoji_Presentation   # 6.1  [1] (😀)
...
1F3FB..1F3FF  ; Emoji_Modifier       # 8.0  [5] (🏻..🏿)

Using Python's unicodedata Module

The standard library only exposes a subset of properties. For emoji properties, use the unicodedata2 or regex module:

import regex

def get_emoji_properties(char: str) -> dict:
    """Return relevant Unicode emoji properties for a character."""
    cp = ord(char)
    return {
        "code_point": f"U+{cp:04X}",
        "character": char,
        "is_emoji": bool(regex.match(r'\p{Emoji}', char)),
        "is_emoji_presentation": bool(regex.match(r'\p{Emoji_Presentation}', char)),
        "is_emoji_modifier": bool(regex.match(r'\p{Emoji_Modifier}', char)),
        "is_emoji_modifier_base": bool(regex.match(r'\p{Emoji_Modifier_Base}', char)),
        "is_emoji_component": bool(regex.match(r'\p{Emoji_Component}', char)),
        "is_extended_pictographic": bool(regex.match(r'\p{Extended_Pictographic}', char)),
    }

print(get_emoji_properties("👋"))
# {
#   'code_point': 'U+1F44B',
#   'character': '👋',
#   'is_emoji': True,
#   'is_emoji_presentation': True,
#   'is_emoji_modifier': False,
#   'is_emoji_modifier_base': True,
#   'is_emoji_component': False,
#   'is_extended_pictographic': True
# }

print(get_emoji_properties("🏽"))
# {
#   'code_point': 'U+1F3FD',
#   'is_emoji': True,
#   'is_emoji_modifier': True,
#   'is_emoji_component': True,
#   ...
# }

JavaScript with Unicode Property Escapes

ES2018 introduced \p{} escapes in regex (requires the u flag):

const tests = {
  emoji: /^\p{Emoji}$/u,
  emojiPresentation: /^\p{Emoji_Presentation}$/u,
  emojiModifier: /^\p{Emoji_Modifier}$/u,
  emojiModifierBase: /^\p{Emoji_Modifier_Base}$/u,
  emojiComponent: /^\p{Emoji_Component}$/u,
  extendedPictographic: /^\p{Extended_Pictographic}$/u,
};

function getProperties(char) {
  return Object.fromEntries(
    Object.entries(tests).map(([k, rx]) => [k, rx.test(char)])
  );
}

console.log(getProperties('🤝'));
// { emoji: true, emojiPresentation: true, emojiModifierBase: true,
//   emojiComponent: false, extendedPictographic: true, ... }

// Note: Emoji_Modifier_Base is NOT a standard \p{} escape in all engines
// Use a library for full coverage

Browser support for \p{Extended_Pictographic} is available in Chrome 64+, Firefox 78+, Safari 11.1+.

Practical Decision Guide

Use case Property to use
"Is this character typically shown as emoji?" Emoji_Presentation
"Should I include reserved future emoji ranges?" Extended_Pictographic
"Is this a skin tone modifier?" Emoji_Modifier
"Can I apply a skin tone to this?" Emoji_Modifier_Base
"Is this character part of a multi-code-point sequence?" Emoji_Component
"Is this character in the Unicode emoji set at all?" Emoji

Property Relationships

The properties form a hierarchy:

Extended_Pictographic
  ├── Emoji_Presentation  (subset of Extended_Pictographic)
  │     └── most "real" emoji
  └── Emoji               (broader, includes text-default symbols)
        ├── Emoji_Modifier_Base  (subset of Emoji)
        └── Emoji_Modifier       (subset of Emoji_Component)

Emoji_Component is orthogonal — ZWJ has Emoji_Component=Yes but Emoji=No.

Validating Emoji Sequences

Valid emoji sequences are defined in emoji-sequences.txt and emoji-zwj-sequences.txt in the UCD. A code point having Emoji=Yes does not mean any combination of emoji code points is valid:

import regex

# A minimal valid sequence checker
VALID_EMOJI = regex.compile(
    r'\p{Extended_Pictographic}\p{Emoji_Modifier}?'     # base + optional modifier
    r'(?:\uFE0F(?:\u20E3)?)?'                            # optional VS16 + keycap
    r'(?:\u200D\p{Extended_Pictographic}\p{Emoji_Modifier}?(?:\uFE0F)?)*'  # ZWJ chain
    r'|[\U0001F1E0-\U0001F1FF]{2}'                       # flag pair
)

for seq in ["👋🏽", "👨‍💻", "🇺🇸", "🏻👋"]:  # last one is invalid order
    match = VALID_EMOJI.fullmatch(seq)
    print(f"{seq}: {'valid' if match else 'invalid'}")

Explore More on EmojiFYI

Outils associés

🔀 Comparaison de plateformes Comparaison de plateformes
Comparez le rendu des emojis sur Apple, Google, Samsung, Microsoft et d'autres plateformes. Visualisez les différences côte à côte.
🔍 Analyseur de séquences Analyseur de séquences
Décodez les séquences ZWJ, les modificateurs de teinte de peau, les séquences de touches et les paires de drapeaux en composants individuels.

Termes du glossaire

Emoji Emoji
Mot japonais (絵文字) signifiant 'caractère image' — petits symboles graphiques utilisés dans la communication numérique pour exprimer des idées, des émotions et des objets.
Emoji en couleur Emoji en couleur
Emoji en couleurs vives rendus à l'aide d'images bitmap ou de graphiques vectoriels colorés, par opposition au rendu monochrome de style texte.
Indicateur régional (RI) Indicateur régional (RI)
Lettres Unicode associées par paires (U+1F1E6 à U+1F1FF) qui forment des emoji de drapeaux nationaux selon les codes ISO 3166-1 alpha-2.
Jointure sans chasse (ZWJ) Jointure sans chasse (ZWJ)
Caractère Unicode invisible (U+200D) utilisé pour combiner plusieurs emoji en un seul emoji composite, comme l'assemblage de personnes et d'objets pour former des emoji de professions.
Modificateur de teinte de peau Modificateur de teinte de peau
Cinq caractères modificateurs Unicode basés sur l'échelle de Fitzpatrick qui permettent de changer la couleur de peau des emoji humains (U+1F3FB à U+1F3FF).
Norme Unicode Norme Unicode
Le système complet d'encodage des caractères maintenu par le Consortium Unicode, définissant les caractères, leurs propriétés, les algorithmes et les formes d'encodage.
Point de code Point de code
Valeur numérique unique attribuée à chaque caractère dans la norme Unicode, écrite au format U+XXXX (par exemple, U+1F600 pour 😀).
Sélecteur de variante (VS) Sélecteur de variante (VS)
Caractères Unicode (VS-15 U+FE0E et VS-16 U+FE0F) qui déterminent si un caractère s'affiche en présentation texte (monochrome) ou en présentation emoji (en couleur).
Séquence emoji Séquence emoji
Ensemble ordonné d'un ou plusieurs points de code Unicode qui représentent ensemble un seul caractère emoji.
Unicode Unicode
Standard universel d'encodage des caractères qui attribue un numéro unique à chaque caractère de tous les systèmes d'écriture et ensembles de symboles, y compris les emoji.

Articles associés