Как устроены эмодзи
Эмодзи (от японского «э» — картинка и «модзи» — знак) — язык пиктограмм, используемый в текстовых сообщениях. Будем говорить исключительно об эмодзи Юникода, как о самых распространённых.
История
В некоторых компьютерах мордашки включали в наборы символов: так, у компьютеров IBM (1981) две мордашки имели коды 1 и 2. Но пользоваться ими проблематично: их нет на клавиатуре, привязаны к платформе, да и коды 0…31 часто имеют собственное управляющее значение.
Смайлик :-) придумали на заре Интернета, в 1982 году.
Конец 1990-х. Везде графика, и в различных системах интернет-общения появилась функция: отыскать в тексте :-) и заменить графической рожей. Кто помнит этот стиль смайликов?
Главный недостаток такого кодирования через особые последовательности — попробуйте передать текст программы, и гарантированно будет ложная замена. Например, в записи f(8) находит смайлик в очках 8).
Было время, когда SMS’ки стоили дорого, и мы экономили символы. Экономили и японцы, и мобильный оператор DoCoMo в 1999 придумал вот такие символы, их и назвали «эмодзи». Кодировка символов собственная докомовская.
В середине 2000-х годов смайликами обзавелись как Гугл в своей почтовой службе, так и Эпл в айфонах. Возник вопрос межплатформенного обмена смайликами, и консорциуму Юникода в 2010 году осталось только возглавить бардак, который они не в силах предотвратить, тем более свободных позиций в Юникоде всё ещё предостаточно: в ожидаемом Юникоде 15.1 пока 150 тысяч символов из 900 тысяч доступных. Добавляли понемногу, по несколько сотен, пока около 2018 не добавили все.
Совет: мало кто знает клавишу Win+; (точка с запятой) или Win+. (точка) из Windows 10+. Она выводит панель символов, в том числе эмодзи.
В том же 2018 Гугл, имея сильные позиции в Консорциуме, добавил эмодзи инклюзивности: по умолчанию большинство эмодзиков бесполые, мужской или женский пол задаётся специально.
Что такое «бесполый»: не имеет явных признаков мужчины или женщины. Нет сисек или усов; одежда, аксессуары и причёска унисекс. Например: у Гугла мужчина-вампир носит бабочку, женщина — чокер, а бесполый — горжет. Конечно, сделано в первую очередь для небинарных, но, извините, «палка-палка-огуречик» тоже бесполый. И вообще хорошая мысль: передавать идею, очищенную от дополнительных смыслов. А если те нужны — устанавливаются дополнительно.
А пока…
Немного теории
Символом будем называть всё, что есть в кодировке: печатаемые символы, управляющие команды, незанятые позиции…
Любая кодировка заключается в замене символов на кодовые последовательности: например, пробел=32, A=65, B=66… Но Юникод пошёл дальше: как только символ попадает в Юникод, ему присваивается кодовая позиция — номер от 0 до 1 114 111 (или от 0 до 10FFFF в шестнадцатеричной системе). А за биты и байты отвечают форматы передачи: UTF-8, Punycode и другие. Вы и сами, если умеете программировать, можете придумать свой формат передачи Юникода.
Если символа нет в шрифте, рисуется белый квадратик тофу, в честь японского соевого сыра тофу.
Заблуждение: Ну что такое, в новом Юникоде теперь крупные эмодзи.
Реальность: Насколько крупно рисовать — это дело прикладного ПО. Задача Юникода — сделать, чтобы все эплы, гуглы и фейсбуки кодировали сходные картинки одинаковыми цифрами.
И даже был курьёзный случай: существовал эмодзи 1F92D — колобок с улыбающимися глазами и ртом, закрытым рукой. Ну явно сдерживает смех. Но Эпл и Фейсбук рисовали глаза широко открытыми — неописуемый ужас. Их разунифицировали, эпловская версия получила номер 1FAE2.
И ещё — Юникод никогда не закодирует конкретную картинку — какого-нибудь преведа или догэ. Юникод кодирует идею, а художник может нарисовать эту идею по-разному.
Односимвольные эмодзи
Пример: ехидный колобок состоит из одного символа 1F600.
С ними проще всего: открываешь любую таблицу символов и находишь эмодзик. Недостаток: если эмодзик новый, он, скорее всего, отобразится тем самым ненавистным тофу.
VS16-эмодзи
Пример: красное сердце 2764+FE0F
Такой механизм применяется в основном для старых символов, существовавших до 2010 года, а также принятых в эмодзи с опозданием (напоминаю, принимали их по несколько сотен за раз). Чтобы отобразить символ графикой, за ним ставится невидимая метка «селектор начертания 16» (variation selector 16) FE0F.
Как вы видите, начинаются сложности, и их цель — избавиться от тофу. Старый символ хоть в текстовом виде, да и будет.
Совет: если в таблице символов видите эмодзи, а копипаста, например, в браузер упорно выводит символ текстом — вероятно, не хватает того самого VS16. Или найдите другую таблицу, или скопируйте-вставьте символ FE0F отдельно.
Существует и обратный селектор — FE0E, делающий из эмодзи текст. Вот вам футбольный мяч+FE0E: ⚽︎
И вообще, если эмодзи многосимвольный, его можно копировать по частям. Если все части скопированы правильно и система знает такой эмодзи, он сразу же отобразится.
Цвета кожи
Пример: негритянская рука OK 1F44C+1F3FF
Как видите, цвет кожи — это просто символ-метка. Система, если может, собирает из руки и тёмной кожи тёмную руку. А если не может — будет просто рука и чёрный лоскут.
Флаги государств
Есть специальный алфавит, и флаг — это две буквы из этого алфавита. В Windows 10 во всех «хромых» браузерах будет «GB», а Firefox содержит флаги государств и всё-таки нарисует «юнион джек».
Зато флаги иногда меняются, в этом загвоздка. В общем, сейчас Консорциум больше рекомендует цветные метки вместо флагов, но за политической обстановкой следит.
ZWJ-последовательности
Пример: белый бесполый врач 1F9D1+1F3FB+200D+2695+FE0F
Посмотрим, как эта штука устроена. Первые два символа — это эмодзи «белый человек». Последние два — посох Асклепия. А между ними — невидимый символ «нулевой соединитель» (zero width joiner) 200D. Даже если система не может собрать из них врача, будет как-то понятно.
Другой вариант — картинка деятельности + ZWJ + символ пола.
А также:
ворона = 🐦 + ZWJ + ⬛
свежачок Юникода 15.1 (выйдет в сентябре): человек, идущий вправо = 🚶♂️ + ZWJ + ➡️ + VS16
Ну и рекордсмен Юникода — межрасовый поцелуй. Целых десять символов: четыре эмодзи, соединённые тремя ZWJ.
Из-за такого устройства у ZWJ-последовательностей есть и второй путь кодирования: производитель придумывает последовательность, вписывающуюся в правила, и если она станет популярной, Консорциум её внесёт в Юникод.
Инклюзивность
Примерно с 2018 начали заботиться об инклюзивности. У каждого эмодзи есть бесполая, мужская и женская версия, исключения три:
женщина в хиджабе (мусульманском платке) 🧕;
женщина, кормящая грудью 🤱;
танцор 💃 — изначально это была женщина в латиноамериканском платье. Потом добавили мужчину в костюме диско 🕺. А вот что будет танцевать бесполая версия — так и не определились (пока склоняются к брейку или контемпу).
Даже беременный мужчина с 2021 есть, тем более парочка беременных людей, которые по документам мужчины, действительно нашлась. А ещё в Англии можно «наесться до беременности», а у нас «беременный» — это с пивным пузом. Также есть несколько эмодзи, связанных с инвалидностью: человек в коляске, с белой тростью…
Забавная история. В шрифте Webdings в позиции 6D находится стилизованный восклицательный знак — мужчина в очках и деловом костюме левитирует. В 2014 году закодировали Wingdings и Webdings, превратив часть картинок в эмодзи — этот левитирующий (1F574), по стандарту, бесполый и может иметь расу.
Когда на картинке двое или более людей, в Юникоде существуют четыре способа раздать им расы:
Собрать через ZWJ из меньших эмодзи. Таких сборок всего четыре: поцелуй (см. выше), рукопожатие, любовь, пара людей. Согласитесь, важные!
Обойти межрасовую тему. Кормление грудью или из бутылки — младенец в шапочке. Массаж лица — массажиста нередко рисуют в перчатках.
Забить на расы из-за комбинаторного взрыва: все семьи без расы, иначе было бы много-много тысяч картинок.
Забить на расы из-за маловажности: борцы и танцоры Плейбоя есть всех трёх полов, но без расы.
Колобки не инклюзивны, они всегда лысые и жёлтые.
У меня есть идея эмодзи. Как предложить?
Консорциум Юникода всегда (а вот и нет, каждый год в апреле-мае) готов выслушать ваши предложения. До настоящих эмодзиков доходят не более четверти заявок. За год выходит 20…30 штук.
Чего они точно НЕ примут:
связанные с текущими событиями: тонущий корабль, коронавирус (Эпл перерисовал 🦠 1F9A0 «микроорганизм»)
конкретные картинки и объекты: догэ, Сталин, Христос, Эйфелева башня. Принять могут только военного: собака 🐕 есть, а телебашни хватит токийской 🗼
надписи, флаги
слишком специфичные: F-35, пицца с колбасой. Принять могут только военный самолёт, пиццу и колбасу
изобразимые текущими картинками: мытьё рук, ведь есть руки 👐 и мыло 🧼
вызывающие каскадное добавление новых эмодзи: ленточки, символизирующие различные заболевания
если автор не смог объяснить, на что эмодзик нужен: уроборос (змей, кусающий собственный хвост). Аэрозольный баллон долго объясняли, но он уже на рассмотрении, а квадрокоптер шесть раз заворачивали.
Я пишу программу «Юникодия» — энциклопедию символов Юникода. Качать тут.