Модуль 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
При сохранении текста в базе данных 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-командам".