Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion emoji/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,14 @@ def is_emoji(string: str) -> bool:
Returns True if the string is a single emoji, and it is "recommended for
general interchange" by Unicode.org.
"""
return string in unicode_codes.EMOJI_DATA
if string in unicode_codes.EMOJI_DATA:
return True
# Check if the string is a fully-qualified form with variation selector
if string.endswith('\uFE0F'):
base = string[:-1]
if base in unicode_codes.EMOJI_DATA:
return unicode_codes.EMOJI_DATA[base].get('variant') is not None
return False


def purely_emoji(string: str) -> bool:
Expand Down
4 changes: 4 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,10 @@ def test_is_emoji():
assert emoji.is_emoji('🇫🇷')
assert not emoji.is_emoji('🇫🇷🇫🇷')
assert not emoji.is_emoji('\ufe0f') # variation selector
# Fully-qualified emoji with variation selector (issue #325)
assert emoji.is_emoji('\u2615\ufe0f') # ☕️
assert emoji.is_emoji('\u2615') # ☕ (without VS16)
assert not emoji.is_emoji('\u2615\ufe0f\ufe0f') # double VS16 is invalid


def test_long_emoji():
Expand Down