СтатьиЮникодСтандарт ЮникодаТехнические приложения к стандарту → UTS 52. Механизм настройки Emoji

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

Черновик стандарта.

14 марта 2016 Перевод: Олег Григорьев Оригинал: Unicode.org

Горный лыжник из Зимбабве в шляпе с национальным флагом

Это вольный пересказ оригинального документа, описывающего новый способ для управления отображением символов Emoji. В данный момент этот документ находится на стадии черновика. Он может быть обновлён, удалён или заменён другими документами в любой момент. Его публикация не означает одобрение со стороны Консорциума Юникода. Кроме того, технические стандарты Юникода (Unicode Technical Standard, UTS), являются независимыми спецификациями. Соответствие основному Стандарту Юникода не подразумевает автоматического соответствия любому из технических стандартов.

Введение

Нам поступает множество предложений о добавлении различных вариаций для символов Emoji. Этот документ предлагает конкретный механизм, который может использоваться для создания таких вариаций, с помощью, так называемых, «символов тегов» (Unicode TAG characters). Он позволяет создавать свои Emoji, не дожидаясь того, когда они будут введены в стандарт.

Базовая идея та же, что и с модификаторами цвета кожи (когда пользователь выбирает у себя на клавиатуре телефона смайлик со смуглой кожей). В памяти устройства такой символ представлен в виде базового символа Emoji и следующего за ним модификатора цвета кожи, который указывает на то, что персонаж на картинке должен быть смуглым. С точки же зрения пользователя, это выглядит, как одиночный символ. Точно также этот символ рассматривается, как единый и различными алгоритмами, например, при разбиении строк и т.п.

При использовании такого механизма, для конкретного Emoji указывается список специальных тег-символов (TAG), которые могут следовать за ним и указывать требуемые настройки. Такая последовательность называется последовательностью Emoji-тегов (emoji tag sequence). Эта последовательность выглядит, как единственный символ для пользователя и обрабатывающих текст алгоритмов. От модификаторов кожи этот механизм отличается большей расширяемостью.

Серое изображение на рисунке ниже обозначает последовательность тег-символов. Изображение слева, это то что видит пользователь, справа — внутреннее представление. Символы тегов, указанные как «…✦» всегда невидимые.

Если последовательность тегов некорректна или не поддерживается на текущем устройстве, пользователь увидит уведомление об этом. Например, так:

Данный механизм используется для показа альтернативной версии конкретного эмоджи. То есть, можно указать, что человек должен быть отображён в виде человека с красными волосами. Но нельзя указать, что человек должен быть отображён в виде чашки чая.

Только те последовательности тегов, которые описаны в этом документе, являются корректными. Другие последовательности (например, ZWJ) поддерживаются многими поставщиками. Юникод каталогизирует их, но не указывает конкретные последовательности.

В первую очередь были определены настройки флагов, пола, цвета волос и направления. Пол, цвет и направление могут быть применены к одном и тому же эмоджи, что может привести к комбинаторному взрыву общего количества всех возможных глифов в шрифтах. В силу этого, предполагается, что производители будут поддерживать только конкретный набор комбинаций.

Флаги

Можно выводить изображения флагов различных регионов и стран, например, Шотландии или Калифорнии.

Набор возможных флагов ограничен административными единицами, определёнными в Юникоде (что, в общем, соответствует стандарту ISO 3166-2) и трёхсимвольными кодами стран ООН. Как и региональные индикаторы, эти эмоджи не определяют конкретную картинку. Также этот механизм не предназначен для произвольных флагов. Например, с помощью его нельзя вывести радужный флаг, пиратский или флаг какого-нибудь футбольного клуба.

Пол

Можно указать пол для эмоджи.

Юникод сам по себе, обычно, не указывает пол для символа: например, если символ «бегущий человек», но не «бегущий мужчина». Однако, для реализма, производители, обычно, создают изображения в виде людей определённого пола. Указание пола позволяет производителям отображать мужскую, женскую и нейтральную версии. При этом, версия по умолчанию (без тегов) совершенно не обязательно соответствует нейтрально-гендерной версии.

Следующий черновой список содержит эмоджи, для которых можно указывать пол. Комментарий (после #) включает в себя версию Стандарта Юникода, в которой этот символ был введён, изображение и название символа.

26F9 # 5.2 Человек с мячом
🏃 1F3C3 # 6.0 Бегун
🏄 1F3C4 # 6.0 Сёрфер
🏊 1F3CA # 6.0 Пловец
🏋 1F3CB # 7.0 Штангист
👤 1F464 # 6.0 Силуэт бюста
👥 1F465 # 6.0 Силуэт двух бюстов
👮 1F46E # 6.0 Офицер полиции
👯 1F46F # 6.0 Женщина с кроличьими ушами
👰 1F470 # 6.0 Невеста с вуалью
👱 1F471 # 6.0 Блондинка
👲 1F472 # 6.0 Мужчина в шапке гуань-пи-мао
👳 1F473 # 6.0 Мужчина в тюрбане
💁 1F481 # 6.0 Информационная стойка
💂 1F482 # 6.0 Караульный
💆 1F486 # 6.0 Массаж лица
💇 1F487 # 6.0 Стрижка волос
🕴 1F574 # 7.0 Парящий мужчина в деловом костюме
🕵 1F575 # 7.0 Сыщик или шпион
🗣 1F5E3 # 7.0 Силуэт говорящей головы
🙅 1F645 # 6.0 Человек жестикулирующий о том, что ему не нравится
🙆 1F646 # 6.0 Человек жестикулирующий, что всё хорошо
🙇 1F647 # 6.0 Глубокий поклон
🙋 1F64B # 6.0 Счастливый человек с поднятой рукой
🙍 1F64D # 6.0 Нахмурившийся человек
🙎 1F64E # 6.0 Человек с надутыми губами
🚣 1F6A3 # 6.0 Вёсельная лодка
🚴 1F6B4 # 6.0 Велосипедист
🚵 1F6B5 # 6.0 Горный велосипедист
🚶 1F6B6 # 6.0 Пешеход
🛀 1F6C0 # 6.0 Баня
🤦 1F926 # 9.0 Фейспалм
🤵 1F935 # 9.0 Мужчина в смокинге
🤷 1F937 # 9.0 Пожимание плечами
🤸 1F938 # 9.0 Делает колесо
🤻 1F93B # 9.0 Современное пятиборье
🤼 1F93C # 9.0 Борец, рестлер
🤽 1F93D # 9.0 Ватерполо
🤾 1F93E # 9.0 Гандбол

Направление

Можно указать различное направление у символов.

Некоторые символы, как правило, имеют направление, которое может быть значимо в рамках последовательностей символов. К сожаление, по историческим причинам, направление «по-умолчанию» является довольно произвольным. Например, вот камера смотрящая влево: 🎥, а вот вправо: 📽.

Пример композиции разнонаправленных символов:

Ну, или, скажем, кто-нибудь, комментируя «Игру престолов» захочет проиллюстрировать фразу «принцесса зарезала принца»:

Вариант (a) более предпочтительнее, так как в (b) кажется, что это принц зарезал принцессу.

Ниже приведён черновой список символов, для которых может быть указано направление:

Заметка: символов, которым, по-идее, можно задать направление, на самом деле, очень много. Тем не менее, мы решили начать с небольшого списка и впоследствии его расширять. Важное свойство направления: изображение, в большинстве случаев, можно просто отзеркалить. Что значительно упрощает разработку и не влияет на размер шрифта (если позволяют соответствующие технологии).

Частное использование

Существуют также частные последовательности тегов, которые используются внутри закрытых систем и не предназначены для открытого обмена. См. ниже техническую спецификацию.

Неподдерживаемые последовательности

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

Таким образом, пользователь получает подсказку, что он видит не совсем то, что задумывалось автором текста. Приведённое изображение не является нормативным, можно сделать базовый символ тусклее или как-то так. Однако, реализация не должна показывать вместо символа какой-то вариант, который не определён в Юникоде (за исключением символов для частного использования).

Заметка: 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» нет.

Заметки по реализации

Все эти модификаторы, в теории, могут использоваться вместе. Это может привести к огромному количеству вариантов и взрывообразному росту количества глифов в шрифтах. Так что подразумевается, что будут поддерживаться только конкретные комбинации, до того момента, пока технологии не позволят сделать всё это проще. Один из вариантов — собирать изображение из кусочков.

Более общий вариант — поддержка цветовых палитр в шрифтах, что позволит просто менять цвет волос и кожи.

Если движок рендеринга текста поддерживает зеркальное отражение символов, то атрибут направления может быть реализован без особенных затрат.