Ваша арабська назва не пошкоджена — магазин просто читає її в іншому напрямку

8 хв читанняКожна цифра з джерелом

Коли арабська, перська чи урду назва приходить у магазин із дужкою не з того боку, з кредитом «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».

Це одне речення пояснює явище, через яке артисти, що пишуть арабським письмом, вважають свої метадані зачарованими: збережений рядок може бути цілком правильним, тоді як відображення хибне, а може бути візуально правильним, тоді як збережені байти хибні, — і на екрані ці дві поломки виглядають однаково. Перевірити це поглядом ви не можете. Не може й агент підтримки вашого дистриб’ютора.

Чому латинський фрагмент усередині RTL-рядка зсувається

UAX #9 дає кожному символу двоспрямований тип. Арабські, перські та урду літери — це AL (арабські літери, справа наліво). Латинські літери — L. Цифри ASCII — EN (European Number), арабо-індійські цифри — AN (Arabic Number). Пробіли й більшість пунктуації — включно з круглими й квадратними дужками, дефісом і крапкою — нейтральні, тобто не мають власного напрямку й успадковують його від оточення.

Шкоду завдають дві групи правил.

Спрямованість абзацу, правила 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.» арабською, перською чи урду в полі назви. Це машинозчитуваний токен, а не слово.

Цифри, і чому ваші можуть бути не тими цифрами, що ви думаєте

У грі три набори цифр:

НабірКодові позиціїДе вживаютьсяДвоспрямований клас
ASCII0–9всюдиEN
Арабо-індійськіU+0660–U+0669 (٠١٢٣٤٥٦٧٨٩)арабськаAN
Розширені арабо-індійськіU+06F0–U+06F9 (۰۱۲۳۴۵۶۷۸۹)перська, урдуEN

Це не стилістичні варіанти. Це різні кодові позиції, і за базою символів Unicode вони не поділяють навіть двоспрямованого класу. Правило W2 з UAX #9 перетипізовує європейське число на арабське, коли найближчий попередній сильний символ є арабською літерою, тож усередині перського тексту вони можуть поводитися однаково під час відображення, — але ніколи в сортуванні, пошуку чи порівнянні рядків, бо це різні символи. «Vol. 2», набране з розширеною арабо-індійською ۲, і «Vol. 2», набране з ASCII 2, — це два різні рядки, які виглядають майже однаково.

Оберіть один набір цифр на каталог і ніколи не змішуйте набори всередині одного рядка.

Як перевірити, що ви насправді набрали

Відображенню довіряти не можна, тож перевіряйте байти. Перед кожною здачею варто зробити три речі:

  1. Читайте рядок як кодові позиції, а не як гліфи. Будь-який інструмент, що показує значення U+, миттєво скаже вам, чи це перська ی (U+06CC), чи арабська ي (U+064A), перська ک (U+06A9) чи арабська ك (U+0643), — розрізнення, яке більшість шрифтів згладжує і якого не побачить жоден коректор. Те саме стосується випадкового татвілу (U+0640), якого не знімає жодна форма нормалізації Unicode, і нерозривника нульової ширини (U+200C), який тихо з’їло поле форми.
  2. Вставте назву в контекст зліва направо і в контекст справа наліво та порівняйте. Якщо пунктуація в цих двох випадках лягає по-різному, у вас рядок зі змішаною спрямованістю і латинський фрагмент, якому місце у власному полі.
  3. Звірте з попереднім релізом символ за символом, а не на око. Розділені каталоги в арабському письмі майже завжди спричинені різницею, якої не видно: один реліз набрано на перській розкладці, наступний — на арабській.

Інструменти Mazufa працюють цілком у вашому браузері — ні аудіо, ні текст нікуди не завантажуються — і автоматично виставляють dir="rtl", коли назва пишеться справа наліво, тож те, що ви бачите під час набору, збігається з контекстом, для якого рядок писався. На mazufa.com також є безкоштовний перевіряч метаданих, що працює на вашому пристрої й позначає кілька невидимих випадків: змішані набори цифр, татвіл, зайвий чи відсутній ZWNJ, арабське проти перського yeh і kaf, а також рядки не в 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/

Корпус подає версії та дати редакцій цих документів, як зазначено вище, і не фіксує для них окремої дати прочитання.

БЕЗКОШТОВНІ ІНСТРУМЕНТИ

Усі інструменти Mazufa працюють у вашому браузері, нічого не коштують і не потребують акаунта.

Відкрити набір інструментів ⇥