Сообщить об ошибке.

Работа с emoji/эмодзи в Python

Модуль emoji представляет функции извлечения Юникода эмодзи по его общепринятому названию/имени, и наоборот преобразование Юникода эмодзи в его имя, определенное консорциумом Unicode.

Модуль emoji поддерживает весь набор общепринятых имен/названий эмодзи, определенный консорциумом Unicode, а также набор псевдонимов. По умолчанию включен только официальный список имен эмодзи, но выполнение emoji.emojize(language='alias') включает как полный список, так и псевдонимы имен эмодзи.

Установка модуля emoji в виртуальное окружение:

# создаем виртуальное окружение 
$ python3 -m venv .venv --prompt VirtualEnv
# активируем виртуальное окружение 
$ source .venv/bin/activate
# ставим модуль emoji
(VirtualEnv) :~$ python3 -m pip install emoji --upgrade

Примеры использования модуля emoji.

>>> import emoji
# заменяет общепринятые имена эмодзи кодами в Юникоде
>>> print(emoji.emojize('Python is :thumbs_up:'))
# Python is 👍

# вывод эмодзи по алиасу
>>> print(emoji.emojize('Python is :thumbsup:', language='alias'))
# Python is 👍

# преобразование эмодзи в юникоде на короткие коды эмодзи
>>> print(emoji.demojize('Python is 👍'))
# Python is :thumbs_up:

>>> print(emoji.emojize("Python is fun :red_heart:"))
# Python is fun ❤

# аргумент `variant` - переключатель вариантов между: 
# базовым (None), VS-15 ("text_type") и VS-16 ("emoji_type")
>>> print(emoji.emojize("Python is fun :red_heart:", variant="emoji_type"))
# Python is fun ❤️

Чтобы получить больше информации об эмодзи, можно найти его в словаре emoji.EMOJI_DATA:

>>> import emoji, pprint
>>> pprint.pprint(emoji.EMOJI_DATA['🌍'])
# {'E': 0.7,
#  'alias': [':earth_africa:'],
#  'de': ':globus_mit_europa_und_afrika:',
#  'en': ':globe_showing_Europe-Africa:',
#  'es': ':globo_terráqueo_mostrando_europa_y_áfrica:',
#  'fr': ':globe_tourné_sur_l’afrique_et_l’europe:',
#  'it': ':europa_e_africa:',
#  'pt': ':globo_mostrando_europa_e_áfrica:',
#  'status': 2,
#  'variant': True}

Замена и удаление эмодзи в строке.

С помощью emoji.replace_emoji() можно заменять, фильтровать, экранировать или удалять эмодзи в строке:

>>> import emoji
# удаление эмодзи из строки
>>> emoji.replace_emoji('Python is 👍', replace='')
# 'Python is '

# замена эмодзи на другой emoji
>>> emoji.replace_emoji('Python is 👍', replace='👎')
# 'Python is 👎'

# замена эмодзи на код из таблицы Юникода
>>> def unicode_escape(chars, data_dict):
...     return chars.encode('unicode-escape').decode()
>>> emoji.replace_emoji('Python is 👍', replace=unicode_escape)
# 'Python is \U0001f44d'

# замена эмодзи на HTML сущность
>>> def xml_escape(chars, data_dict):
...     return chars.encode('ascii', 'xmlcharrefreplace').decode()
>>> emoji.replace_emoji('Python is 👍', replace=xml_escape)
# 'Python is 👍'

# замена эмодзи на описание символа из таблицы Юникода
>>> emoji.replace_emoji('Python is 👍', replace=lambda chars, data_dict: chars.encode('ascii', 'namereplace').decode())
# 'Python is \N{THUMBS UP SIGN}'

Извлечение эмодзи из строки.

Функция emoji.emoji_list() находит все смайлики в строке и их положение. Имейте в виду, что смайлик может состоять из нескольких символов Юникода:

>>> emoji.emoji_list('Python is 👍')
# [
#     {'match_start': 10, 'match_end': 11, 'emoji': '👍'}
# ]
>>> emoji.emoji_list('A 👩‍🚀 aboard a 🚀')
# [
#     {'match_start': 2, 'match_end': 5, 'emoji': '👩‍🚀'}, 
#     {'match_start': 15, 'match_end': 16, 'emoji': '🚀'}
# ]

Чтобы получить отдельный набор эмодзи из строки, используйте emoji.different_emoji_list():

>>> emoji.distinct_emoji_list('Some emoji: 🌍, 😂, 😃, 😂, 🌍, 🌦️')
['😃', '😂', '🌦️', '🌍']

Чтобы подсчитать количество эмодзи в строке, используйте emoji.emoji_count():

>>> emoji.emoji_count('Some emoji: 🌍, 😂, 😃, 😂, 🌍, 🌦️')
# 6
>>> emoji.emoji_count('Some emoji: 🌍, 😂, 😃, 😂, 🌍, 🌦️', unique=True)
# 4

Можно проверить, является ли строка единственным допустимым смайликом с помощью emoji.is_emoji().

>>> emoji.is_emoji('🌍')
# True
>>> emoji.is_emoji('🌍😂')
# False
>>> emoji.is_emoji('test')
# False

Хранение текста с элементами emoji/эмодзи в базе данных MySQL.

При сохранении текста в базе данных MySQL, в котором содержаться эмодзи/emoji может появляться ошибка:

(Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)

хотя в таблице MySQL уже установлена кодировка utf-8 и сопоставление utf8_general_ci. Почему такое происходит?

Дело в том, что в MySQL кодировка UTF8 означает utf8mb3, которая не поддерживает расширенную таблицу символов Юникода. Тем временем был добавлен новый расширенный формат utf8mb4, но разработчики MySQL UTF8 не переключили на значение utf8mb4 по умолчанию.

Это означает, что нужно специально конвертировать таблицу MySQL в utf8mb4, а также необходимо использовать utf8mb4 при подключении к базе данных.

Конвертировать таблицу из utf8mb3 в формат utf8mb4 можно просто выполнив MySQL команду:

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Для того, что бы новые таблицы БД создавались в этой-же кодировке необходимо выполнить еще одну MySQL команду:

ALTER DATABASE your_database DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;

При подключении к базе данных из сценария Python, также необходимо указать кодировку:

from MySQLdb import connect, cursors

# конфигурация соединения с базой данных
MYSQLCONF = {
    'host': 'localhost', # хост базы данных
    'user': 'user', # имя пользователя базы данных
    'password': 'password', # пароль пользователя базы данных
    'db': 'test_db', # имя базы данных
    'charset': 'utf8mb4', # используемая кодировка базы данных
    'use_unicode': True # обрабатывать строки в Юникоде
}

# поднимаем соединение с базой данных
db = connect(**MYSQLCONF)

Важно. Пример подключении к базе данных test_db будет обрабатывать все ее таблицы в кодировке utf8mb4. Это говорит о том, что таблицы (которые остались) в формате utf8mb3 могут обрабатываться неправильно. По этому, желательно перевести всю БД в новую кодировку utf8mb4. Дополнительно смотрите как создать скрип для конвертации всех таблиц базы данных в материале "Галопом по полезным MySQL-командам".