Когда арабское, персидское или урду название приходит в магазин со скобкой не с той стороны, с указанием «feat.», уехавшим в дальний конец, или с каталожным номером, повисшим не там, где надо, ничего не испортилось. Байты, которые вы набрали, почти всегда и есть те байты, которые доехали. Изменилось базовое направление того поля, в которое отрисовывается текст, а его определяет страница магазина, а не ваше название. Эта статья объясняет механизм достаточно точно, чтобы вы могли предсказать, какие из ваших названий сломаются, ещё до поставки.
Одну вещь стоит сказать сразу, потому что это честная позиция: нам неизвестно ни одного опубликованного измерения частоты ошибок в метаданных на арабской графике где-либо в отрасли. Проблему испытывают все, и она совершенно не измерена. Ни одной цифры ниже не приводится, потому что приводить нечего.
Логический порядок и порядок отображения — разные вещи
Unicode хранит текст в логическом порядке — в том, в каком вы его произносите, набираете и читаете вслух. Порядок отображения вычисляется из него при отрисовке двунаправленным алгоритмом Unicode, определённым в Unicode Standard Annex #9 (UAX #9). Приложение высказывается об этом разделении прямо: «The Unicode Standard prescribes a memory representation order known as logical order» и «When working with bidirectional text, the characters are still interpreted in logical order—only the display is affected».
Одна эта фраза объясняет явление, из-за которого артисты, пишущие арабской графикой, считают свои метаданные заколдованными: сохранённая строка может быть совершенно верной при неверном отображении, и она может выглядеть верно при неверных сохранённых байтах — а на экране эти два сбоя выглядят одинаково. Проверить это глазами нельзя. Сотруднику поддержки вашего дистрибьютора — тоже.
Почему латинская вставка внутри строки справа налево уезжает
UAX #9 присваивает каждому символу двунаправленный тип. Арабские, персидские и урду буквы — это AL (арабские буквы справа налево). Латинские буквы — L. Цифры ASCII — EN (европейское число), арабо-индийские цифры — AN (арабское число). Пробелы и большая часть пунктуации — включая круглые и квадратные скобки, дефис и точку — нейтральны, то есть собственного направления не имеют и наследуют его от окружения.
Ущерб наносят две группы правил.
Направление абзаца, правила P2–P3. Алгоритм ищет первый сильный направленный символ и задаёт по нему базовое направление. Название, начинающееся с латинского слова, получает базовое направление слева направо, даже если всё после него — персидское.
Разрешение нейтралей, правила N1–N2. Правило N1: «A sequence of [neutrals] takes the direction of the surrounding strong text if the text on both sides has the same direction». Правило N2: нейтрали без согласия сторон принимают направление абзаца. Затем правило L2 переставляет их для отображения — «reverse any contiguous sequence of characters that are at that level or higher».
Сложите это вместе — и сбой окажется детерминированным, а не случайным. Латинская вставка — имя ремиксера, feat., Vol. 2, каталожный номер, год — находится на другом уровне вложенности, чем окружающий её арабский текст. У нейтралей на её границах (пробел, открывающая скобка) с одной стороны арабский, с другой латиница, поэтому N1 не находит согласия, а N2 передаёт им направление абзаца. Скобка, разрешившаяся одним образом в вашем редакторе справа налево, разрешается иначе на странице магазина слева направо — и скобка отрывается и переворачивается.
Так что نام آهنگ (Nima Remix) не сломано. Это одна строка, разрешаемая в двух контекстах. Базовое направление — это контекст, а не содержимое, и контекст магазина не ваш.
Единственное, чего делать нельзя ни в коем случае
Не «чините» отображение, набирая символы задом наперёд, пока предпросмотр не станет выглядеть правильно.
Так получается строка, неверная в логическом порядке, верная ровно в одном контексте отрисовки и сломанная везде остальном — включая поиск, сортировку, сопоставление артистов и любой магазин, чья страница имеет базовое направление, отличное от того инструмента, в котором вы «починили». Вы превратите проблему отображения, которая поправима, в проблему данных, которая нет.
UAX #9 действительно определяет символы для явного управления этим: изоляты LRI, RLI, FSI и PDI и метки LRM, RLM и ALM. Технически это правильное решение. Это также невидимые форматирующие символы, а многие конвейеры поставки вырезают невидимые форматирующие символы, вас не спрашивая. Считайте их ненадёжными в поле метаданных.
Структурное решение: убрать латинскую вставку из середины
Смягчение, которое работает везде, в любом отрисовщике и без невидимых символов, — структурное. В порядке предпочтения:
- Используйте отдельные поля вместо строк со смешанным направлением везде, где модель данных их предлагает. Приглашённый артист принадлежит уровню роли артиста, а не названию. Music Metadata Style Guide от Music Biz советует указывать приглашённых артистов на уровне роли артиста и не добавлять эти данные в название трека или релиза; публичная рекомендация Spotify звучит так: «You shouldn't include any artists' names in your track or release titles». Версия принадлежит полю версии, вся задача которого — различать две записи с одинаковым названием. Каждая латинская вставка, перенесённая в собственное поле, — это исчезнувшая двунаправленная граница.
- Не ставьте неизбежную латинскую вставку на первое место. Первая позиция задаёт направление абзаца по P2–P3. Персидское название, открывающееся латинским словом, — это абзац слева направо, содержащий персидский текст, а вы имели в виду не это.
- Избегайте декоративной пунктуации на границах направления. Тире, слэши, вертикальные черты и нагромождённые скобки — это нейтрали, стоящие ровно там, где у алгоритма меньше всего информации.
Там, где договор действительно требует указания в названии, соглашения жёстко зафиксированы и им стоит следовать в точности. Music Biz о «feat.» и «with»: «when included in the title are generally lowercase and in English». Руководство по стилю Apple: «Formatting of 'feat.' and 'with' must be lowercase, in English, not localized, and in parentheses or brackets». Указание «not localized» здесь делает реальную работу: не переводите «feat.» на арабский, персидский или урду в поле названия. Это машиночитаемая метка, а не слово.
Цифры, и почему у вас, возможно, не те цифры, о которых вы думаете
В игре три набора цифр:
| Набор | Кодовые позиции | Где используется | Класс bidi |
|---|---|---|---|
| ASCII | 0–9 | везде | EN |
| Арабо-индийские | U+0660–U+0669 (٠١٢٣٤٥٦٧٨٩) | арабский | AN |
| Расширенные арабо-индийские | U+06F0–U+06F9 (۰۱۲۳۴۵۶۷۸۹) | персидский, урду | EN |
Это не стилистические варианты. Это разные кодовые позиции, и по базе символов Unicode у них не совпадает даже двунаправленный класс. Правило W2 из UAX #9 переопределяет европейское число в арабское, когда ближайший предшествующий сильный символ — арабская буква, так что внутри персидского текста при отображении они могут вести себя одинаково, но никогда — при сортировке, поиске или сравнении строк, потому что это разные символы. «Vol. 2», набранное расширенной арабо-индийской ۲, и «Vol. 2», набранное цифрой ASCII 2, — это две разные строки, выглядящие почти неотличимо.
Выберите один набор цифр на каталог и никогда не смешивайте наборы внутри одной строки.
Как проверить, что вы на самом деле набрали
Отображению доверять нельзя, поэтому проверяйте байты. Три вещи стоит делать перед каждой поставкой:
- Читайте строку как кодовые позиции, а не как глифы. Любой инструмент, показывающий значения U+, мгновенно скажет вам, персидская это ی (U+06CC) или арабская ي (U+064A), персидская ک (U+06A9) или арабская ك (U+0643), — различие, которое большинство шрифтов сглаживает и которое не увидит ни один корректор. То же касается затесавшегося татвиля (U+0640), который не убирает ни одна форма нормализации Unicode, и неразрывного нуля ширины (U+200C), молча съеденного полем формы.
- Вставьте название в контекст слева направо и в контекст справа налево и сравните. Если пунктуация встаёт по-разному, у вас строка со смешанным направлением и латинская вставка, которой место в отдельном поле.
- Сверьтесь с предыдущим релизом посимвольно, а не на глаз. Разорванные каталоги на арабской графике почти всегда возникают из-за невидимой разницы: один релиз набран на персидской раскладке, следующий — на арабской.
Инструменты Mazufa работают целиком в вашем браузере — ни аудио, ни текст никуда не загружаются — и автоматически выставляют dir="rtl", когда название идёт справа налево, так что видимое при наборе совпадает с контекстом, для которого строка написана. На mazufa.com также есть бесплатный проверщик метаданных, работающий на вашем устройстве и отмечающий несколько невидимых случаев: смешанные наборы цифр, татвиль, лишний или пропущенный ZWNJ, арабские против персидских йе и каф, а также строки не в NFC.
Что сделать перед поставкой
Возьмите название и имя артиста своего следующего релиза и сделайте четыре вещи. Перенесите каждую латинскую вставку, какую можете, в собственное поле — приглашённых артистов в роль артиста, версии в поле версии. Убедитесь, что ничто не начинается с латинского слова. Приведите к одному набору цифр и уберите татвиль. Затем один раз прочитайте строку как кодовые позиции и сохраните именно эту строку как каноническое написание, которое будете переиспользовать во всех будущих релизах, не набирая заново.
Если название всё же вынуждено нести латинскую вставку в середине, поставляйте его и примите, что в разных местах оно будет отрисовываться по-разному. Это исход отображения, а не повреждение. Строка верна. Перенабор задом наперёд ради того, чтобы один предпросмотр выглядел правильно, — единственный способ сделать её действительно неверной.
Источники
- Unicode Standard Annex #9, Unicode Bidirectional Algorithm (Revision 51, Unicode 17.0.0, 2025-08-13) — https://www.unicode.org/reports/tr9/
- Unicode Standard Annex #15, Unicode Normalization Forms (Version 57, Unicode 17.0.0, 2025-07-30) — https://www.unicode.org/reports/tr15/
- Unicode Character Database — свойства символов: двунаправленный класс, отображения декомпозиции — https://www.unicode.org/ucd/
- Music Business Association, Music Metadata Style Guide v2.1 — https://www.musicbiz.org/wp-content/uploads/2016/04/MusicMetadataStyleGuide_V2.1.pdf
- Apple Music Style Guide — https://help.apple.com/itc/musicstyleguide/en.lproj/static.html
- Spotify for Artists, Music metadata guidelines — https://support.spotify.com/us/artists/article/metadata-formatting-guidelines/
Корпус даёт версии и даты редакций этих документов, перечисленные выше, и не фиксирует для них отдельной даты прочтения.