UTS 52. Механизм настройки Emoji
Черновик стандарта.

Горный лыжник из Зимбабве в шляпе с национальным флагом
Введение
Нам поступает множество предложений о добавлении различных вариаций для символов Emoji. Этот документ предлагает конкретный механизм, который может использоваться для создания таких вариаций, с помощью, так называемых, "символов тегов" (Unicode TAG characters). Он позволяет создавать свои Emoji, не дожидаясь того, когда они будут введены в стандарт.
Базовая идея та же, что и с модификаторами цвета кожи (когда пользователь выбирает у себя на клавиатуре телефона смайлик со смуглой кожей). В памяти устройства такой символ представлен в виде базового символа Emoji и следующего за ним модификатора цвета кожи, который указывает на то, что персонаж на картинке должен быть смуглым. С точки же зрения пользователя, это выглядит, как одиночный символ. Точно также этот символ рассматривается, как единый и различными алгоритмами, например, при разбиении строк и т.п.
При использовании такого механизма, для конкретного Emoji указывается список специальных тег-символов (TAG), которые могут следовать за ним и указывать требуемые настройки. Такая последовательность называется последовательностью Emoji-тегов (emoji tag sequence). Эта последовательность выглядит, как единственный символ для пользователя и обрабатывающих текст алгоритмов. От модификаторов кожи этот механизм отличается большей расширяемостью.
Серое изображение на рисунке ниже обозначает последовательность тег-символов. Изображение слева, это то что видит пользователь, справа — внутреннее представление. Символы тегов, указанные как "…✦" всегда невидимые.
Если последовательность тегов некорректна или не поддерживается на текущем устройстве, пользователь увидит уведомление об этом. Например, так:
Данный механизм используется для показа альтернативной версии конкретного эмоджи. То есть, можно указать, что человек должен быть отображён в виде человека с красными волосами. Но нельзя указать, что человек должен быть отображён в виде чашки чая.
Только те последовательности тегов, которые описаны в этом документе, являются корректными. Другие последовательности (например, ZWJ) поддерживаются многими поставщиками. Юникод каталогизирует их, но не указывает конкретные последовательности.
В первую очередь были определены настройки флагов, пола, цвета волос и направления. Пол, цвет и направление могут быть применены к одном и тому же эмоджи, что может привести к комбинаторному взрыву общего количества всех возможных глифов в шрифтах. В силу этого, предполагается, что производители будут поддерживать только конкретный набор комбинаций.
Флаги
Можно выводить изображения флагов различных регионов и стран, например, Шотландии или Калифорнии.
Набор возможных флагов ограничен административными единицами, определёнными в Юникоде (что, в общем, соответствует стандарту ISO 3166-2) и трёхсимвольными кодами стран ООН. Как и региональные индикаторы, эти эмоджи не определяют конкретную картинку. Также этот механизм не предназначен для произвольных флагов. Например, с помощью его нельзя вывести радужный флаг, пиратский или флаг какого-нибудь футбольного клуба.
Пол
Можно указать пол для эмоджи.
Юникод сам по себе, обычно, не указывает пол для символа: например, если символ "бегущий человек", но не "бегущий мужчина". Однако, для реализма, производители, обычно, создают изображения в виде людей определённого пола. Указание пола позволяет производителям отображать мужскую, женскую и нейтральную версии. При этом, версия по умолчанию (без тегов) совершенно не обязательно соответствует нейтрально-гендерной версии.
Следующий черновой список содержит эмоджи, для которых можно указывать пол. Комментарий (после #) включает в себя версию Стандарта Юникода, в которой этот символ был введён, изображение и название символа.
Направление
Можно указать различное направление у символов.
Некоторые символы, как правило, имеют направление, которое может быть значимо в рамках последовательностей символов. К сожаление, по историческим причинам, направление "по-умолчанию" является довольно произвольным. Например, вот камера смотрящая влево: 🎥, а вот вправо: 📽.
Пример композиции разнонаправленных символов:
Ну, или, скажем, кто-нибудь, комментируя "Игру престолов" захочет проиллюстрировать фразу "принцесса зарезала принца":
Вариант (a) более предпочтительнее, так как в (b) кажется, что это принц зарезал принцессу.
Ниже приведён черновой список символов, для которых может быть указано направление:
⛏ | 26CF | # 5.2 | Кирка |
✈ | 2708 | # 1.1 | Самолёт |
✋ | 270B | # 6.0 | Поднятая рука |
✌ | 270C | # 1.1 | Жест победы |
🏃 | 1F3C3 | # 6.0 | Бегун |
🏊 | 1F3CA | # 6.0 | Пловец |
👀 | 1F440 | # ?.0 | Глаза |
👋 | 1F44B | # 6.0 | Открытая ладонь |
👌 | 1F44C | # 6.0 | Жест о'кей |
👍 | 1F44D | # 6.0 | Жест "хорошо" (большой палец поднят) |
👏 | 1F44F | # 6.0 | Хлопающие ладони |
💨 | 1F4A8 | # 6.0 | Dash symbol |
💪 | 1F4AA | # 6.0 | Бицепс |
🔨 | 1F528 | # 6.0 | Молоток |
🔫 | 1F52B | # 6.0 | Пистолет |
🗡 | 1F5E1 | # 7.0 | Кинжал |
😘 | 1F618 | # 6.0 | Лицо, посылающее поцелуй |
🚬 | 1F6AC | # 6.0 | Знак курения |
🚴 | 1F6B4 | # ?.0 | Велосипедист |
🚵 | 1F6B5 | # ?.0 | Горный велосипедист |
🚶 | 1F6B6 | # 6.0 | Пешеход |
🤘 | 1F918 | # 8.0 | Жест рога |
🤺 | 1F93A | # 9.0 | Фехтовальщик |
🤽 | 1F93D | # 9.0 | Ватерполо |
🤾 | 1F93E | # 9.0 | Гандбол |
🥆 | 1F946 | # 9.0 | Винтовка |
Заметка: символов, которым, по-идее, можно задать направление, на самом деле, очень много. Тем не менее, мы решили начать с небольшого списка и впоследствии его расширять. Важное свойство направления: изображение, в большинстве случаев, можно просто отзеркалить. Что значительно упрощает разработку и не влияет на размер шрифта (если позволяют соответствующие технологии).
Частное использование
Существуют также частные последовательности тегов, которые используются внутри закрытых систем и не предназначены для открытого обмена. См. ниже техническую спецификацию.
Неподдерживаемые последовательности
Если реализация не поддерживает механизм тегов, символы тегов должны быть невидимыми и не занимать места. Если реализация знает об этом механизме, но последовательность является некорректной или не поддерживается текущей реализацией, то символ должен отображаться с вопросительным знаком:
Таким образом, пользователь получает подсказку, что он видит не совсем то, что задумывалось автором текста. Приведённое изображение не является нормативным, можно сделать базовый символ тусклее или как-то так. Однако, реализация не должна показывать вместо символа какой-то вариант, который не определён в Юникоде (за исключением символов для частного использования).
Заметка: Emoji SC и UTC должны фокусироваться на "общих" символах, а не на их конкретных версиях.
Заметка: рассматривались и другие модели:
- Дополнительные символы-модификаторы. Но их добавление в стандарт, обычно, идёт очень долго.
- Использование Variation Selectors. Но их число ограничено и они могут использоваться только по одному на один базовый символ. Они используются в слишком большом количестве ПО, чтобы их поведение можно было изменить без серьёзных проблем с совместимостью.
Совместимость
Любая совместимая с Юникодом реализация, которая реализует emoji tag sequences (далее "последовательность тегов"), должна делать это, как описано в этом документе.
Заметка: ниже идут черновые предложения, которые должны быть уточнены.
C1. Никакие последовательности тегов не должны обрабатываться, если они не соответствуют описанному в этом документе.
C2. Любые поддерживаемые последовательности должны отображаться в соответствии со спецификациями, описанными в этом документе. Например, добавление красных волос к спринтеру не должно менять его на пловца.
C3. Любая некорректная или неподдерживаемая последовательность должна отображаться с соответствующим изображением, как описано в этом документе. Изображение должно являть собой базовый символ с наложенным знаком вопроса.
Техническая спецификация
Здесь описано, как определять корректные последовательности тегов.
3.1. Синтаксис
Используется 95 невидимых символов тегов:
U+E0020..U+E007F (TAG SPACE..CANCEL TAG).
Они соответствуют ASCII-символам и могут указываться, как TAG-<ascii-символ>
.
Например, U+E0056, как TAG-V (код V — 0056).
В примерах, когда ясно, какой тег используется, он указывается с помощью ASCII-символа.
Так же тег может быть указан символом ✦
.
Символы регулярных выражений, ?, *, +
имеют их обычное значение.
Кроме того, вводятся специальные обозначения:
Запись Символы Описание
tag-base [:emoji=yes:] любой отдельный символ Emoji (кроме региональных индикаторов)
tag-term U+E007F CANCEL TAG завершающий тег ✦
tag-keyChar Tag-A..Tag-Z символы тегов, соответствующие заглавным буквам A..Z
tag-valChar U+E0020..U+E0040, U+E005B..U+E007E теги, не входящие ни в tag-term, ни в tag-keyChar
Заметка: изначально планировалось добавить нижеследующие определения в UTS #51. Но, так как, этот документ теперь описывает более общий механизм, возможно, лучше переместить их сюда.
ED-10a. Последовательность тегов
Последовательность состоит из базового символа Emoji и следующих за ним символов тегов, оканчиваясь завершающим тегом.
emoji-tag-sequence := tag-base-item tag-key-value-pair+ tag-term
tag-base-item := tag-base | tag-base_variation_sequence
tag-key-value-pair := tag-key tag-value
tag-key := tag-keyChar+
tag-value := tag-valueChar+
ED-10b. tag-base-variation-sequence — последовательность, начинающаяся с tag-base
.
ED-13. emoji modifier sequence, и ED-15. emoji core sequence
Дополнительные ограничения:
- Длина всей последовательности, включая
tag-base
иtag-term
ограничена 16 символами. - Внутри последовательности,
tag-key-value-pairs
должны идти в порядке возрастания кодаtag-key
. - Внутри последовательности две
tag-key-value-pairs
не могут иметь один и тот жеtag-key
. - Ключ не может начинаться с Tag-Z (за исключением частных последовательностей).
- Если используется частный ключ, он должен быть единственным.
- Дальнейшая структура
tag-value
определяется указанным для неёtag-key
. tag-value
может иметь единую семантику или более сложную структуру. Например, для конкретногоtag-key
может требоваться упорядоченный набор символов вtag-value
.
Таким образом, в терминах ASCII, каждый ключ, это последовательность тегов, которая содержит один или несколько символов A..Z.
Примеры ключей: A
, AB
, ZZ
.
Значение (value), это любая последовательность из одного или более символов от _
(Tag-space) до ~
(кроме A..Z).
Например, если tag-key-value-pair
содержит Fusca
, значит ключ — F
, а значение — usca
.
Интерпретация каждой пары ключ-значения (tag-key-value-pair), зависит от базового символа (tag-base), ключа (tag-key) и значения (tag-value).
Пример: <tag-base>ABxAy✦
— это некорректно, как и <tag-base>AxAy✦
.
Замечание: текущая максимальная длина (16) не определена окончательно. Единственно, все сходятся во мнении, что ограничение должно быть.
Замечание: рассматривается вопрос по поводу того, нужен ли tag-term
(завершающий тег).
В теории, после любой последовательности тегов всё равно должны идти символы, которые не являются тегами, так что отдельный символ для завершения является избыточным.
Замечание: с другой стороны с tag-terms
гораздо проще определять окончание последовательности.
Вышеприведённый синтаксис описывает корректную последовательность тегов.
Однако, только те последовательности, которые описаны ниже в этом документе являются разрешёнными.
Остальные зарезервированы на будущее.
Для конкретного tag-base
могут быть допустимыми только конкретные ключи.
А для конкретного ключа, только определённые значения.
Кроме того, tag-value
может иметь свой собственный внутренний синтаксис.
3.2. Флаги
Синтаксис
Tag-Base: U+1F3F3 (развивающийся белый флаг)
Tag-Key: Tag-V
Tag-Value: (Tag-0..Tag-9, Tag-a..Tag-z)+
Дополнительные ограничения
1. Tag-Value должен соответствовать географическим подразделениям Юникода (subdivision_id) или 3-х символьными региональным тегам (unicode_region_subtags) (см. http://unicode.org/reports/tr35/index.html#unicode_subdivision_id). Корректными являются только те значения, у которых idStatus равняется "regular" или "deprecated". Однако, deprecated-значения включены сюда только для совместимости и не должны использоваться. Синтаксис также поддерживает 3-х символьные формы для будущей совместимости (но сейчас корректных вариантов нет).
2. Допустимы только теги в нижнем регистре (a..z) и цифры (0..9).
3. Как и текущие региональные идентификаторы, они определяют флаг конкретного региона в общем виде (обычно, это текущий флаг региона). Нельзя указать версии флагов, которые, например, использовались в этой местности раньше.
Например, <U+1F3F3>Vgbsct✦
указывает флаг региона "gbsct", соответствующий Шотландии.
Обратите внимание, что в отличии от "GB-SCT" (формат ISO) здесь не используется дефис и все символы находятся в нижнем регистре.
3.3. Атрибуты основной информации
Атрибуты используются для указания символа Emoji, имеющего конкретные атрибуты. Сейчас определены 3 типа атрибутов:
- Цвет волос
- Пол персонажа
- Направление
Дополнительные ограничения
Список значений Tag-Base и tag-key-value-pair приведён ниже. Символ Tag-Base может принадлежать любому из перечисленных классов. Каждый класс имеет набор корректных атрибутов. Дополнительные классы и атрибуты могут быть добавлены в будущих версиях.
Выбор символов для Tag-Value несколько произволен, так как они всё равно не видны пользователям. Однако, они выбирались, по возможности, на основе мнемонического соответствия для более удобной отладки (удобнее чем работать с Tag-1, Tag-2...).
Дополнительные свойства Emoji добавлены в emoji-tags.txt.
3.3. Атрибут пола
Синтаксис
Tag-Base: Gender_Base
Tag-Key: Tag-G
Tag-Value: Один из следующих tag-valueChars:
Tag-m: Мужской
Tag-f: Женский
Tag-n: Нейтральный
Примеры:
Спринтер-мужчина: 🏃Gm✦
.
Спринтерша: 🏃Gf✦
.
3.5. Атрибут волос
Синтаксис
Tag-Base: Hair_Base
Tag-Key: Tag-H
Tag-Value: Один из следующих tag-valueChars:
Tag-k: Чёрные
Tag-s: Белые (и рыжеватые)
Tag-b: Коричневые
Tag-r: Красные (имбирные)
Tag-g: Серые
Tag-n: Плешь
Пример: женщина-спринтер с красными волосами — 🏃GfHr✦
.
3.6. Атрибут направления
Синтаксис
Tag-Base: Direction_Base
Tag-Key: Tag-D
Tag-Value: Один из следующих tag-valueChars:
Tag-r: направо
Tag-l: налево
Направление изменяется в контексте bidi (двунаправленный текст).
У всех Emoji-символов свойство Bidi_Class
имеет значение OtherNeutral
(за исключением вложенных алфавитно-цифровых символов).
Пример: красноволосая женщина-спринтер бежит направо: 🏃DrGrHr✦
.
3.7. Частное использование
Эти последовательности используются внутри закрытых систем.
Как и символы для частного использования, они могут не иметь никакого смысла за пределами этих систем.
Они не предназначены для обмена с внешним миром.
Могут иметь любые ключи, начинающиеся с Tag-Z
и любые значения.
Синтаксис
Tag-Base: emoji-character
Tag-Key: Tag-Z tag-keyChar*
Tag-Value: tag-valChar+
Пример: спринтер в лыжных ботинках для частного использования — 🏃Zskiboots✦
.
Для подобных вещей можно просто использовать символы из диапазона "private use". Однако, такие последовательности имеют ряд преимуществ:
- если нельзя отобразить получившийся символ — отображается базовый Emoji, а не просто квадратик, как при несуществующем символе.
- такие кастомизированные Emoji наследуют свои свойства от базового символа, в то время, как отдельный символ из "private use" нет.
Заметки по реализации
Все эти модификаторы, в теории, могут использоваться вместе. Это может привести к огромному количеству вариантов и взрывообразному росту количества глифов в шрифтах. Так что подразумевается, что будут поддерживаться только конкретные комбинации, до того момента, пока технологии не позволят сделать всё это проще. Один из вариантов — собирать изображение из кусочков.
Более общий вариант — поддержка цветовых палитр в шрифтах, что позволит просто менять цвет волос и кожи.
Если движок рендеринга текста поддерживает зеркальное отражение символов, то атрибут направления может быть реализован без особенных затрат.