Kiedy tytuł arabski, perski albo w urdu dociera do sklepu z nawiasem po złej stronie, z dopiskiem „feat.” zepchniętym na sam koniec albo z numerem katalogowym unoszącym się tam, gdzie nie powinien, nic nie zostało uszkodzone. Bajty, które wpisałeś, prawie zawsze są bajtami, które dotarły. Zmienił się kierunek bazowy pola, w którym tekst jest rysowany, a o nim decyduje strona sklepu, nie twój tytuł. Ten artykuł wyjaśnia mechanizm na tyle dokładnie, żebyś potrafił przewidzieć, który z twoich tytułów się rozjedzie, zanim go dostarczysz.
Jedna rzecz na wstępie, bo taka jest uczciwa pozycja: nie znamy w tej branży żadnego opublikowanego pomiaru odsetka błędów w metadanych pisanych alfabetem arabskim. Problem jest doświadczany powszechnie i zupełnie niepoliczony. Poniżej nie pojawia się żadna liczba, bo nie ma liczby do podania.
Kolejność logiczna i kolejność wyświetlania to dwie różne rzeczy
Unicode przechowuje tekst w kolejności logicznej — tej, w której go wymawiasz, piszesz i czytasz na głos. Kolejność wyświetlania wylicza się z niej w chwili renderowania, algorytmem Unicode Bidirectional Algorithm zdefiniowanym w Unicode Standard Annex #9 (UAX #9). Aneks mówi o tym rozdziale bez ogródek: "The Unicode Standard prescribes a memory representation order known as logical order," oraz "When working with bidirectional text, the characters are still interpreted in logical order—only the display is affected."
To jedno zdanie wyjaśnia zjawisko, przez które artyści piszący alfabetem arabskim wierzą, że ich metadane są nawiedzone: przechowywany ciąg może być całkowicie poprawny, gdy wyświetlanie jest błędne, i może wyglądać poprawnie, gdy przechowywane bajty są błędne — a na ekranie te dwie awarie wyglądają identycznie. Nie zbadasz tego wzrokiem. Konsultant wsparcia twojego dystrybutora też nie.
Dlaczego łaciński człon wewnątrz ciągu RTL się przesuwa
UAX #9 nadaje każdemu znakowi typ dwukierunkowy. Litery arabskie, perskie i urdu to AL (litery arabskie pisane od prawej do lewej). Litery łacińskie to L. Cyfry ASCII to EN (European Number), cyfry arabsko-indyjskie to AN (Arabic Number). Spacje i większość znaków interpunkcyjnych — w tym nawiasy okrągłe, kwadratowe, łącznik i kropka — są neutralne, czyli nie mają własnego kierunku i dziedziczą go z otoczenia.
Szkody wyrządzają dwie grupy reguł.
Kierunek akapitu, reguły P2–P3. Algorytm szuka pierwszego silnego znaku kierunkowego i od niego ustala kierunek bazowy. Tytuł zaczynający się od słowa łacińskiego dostaje kierunek od lewej do prawej, nawet jeśli wszystko po nim jest perskie.
Rozstrzyganie neutralnych, reguły N1–N2. Reguła N1: "A sequence of [neutrals] takes the direction of the surrounding strong text if the text on both sides has the same direction." Reguła N2: neutralne bez zgodności przyjmują kierunek akapitu. Potem reguła L2 przestawia je do wyświetlenia — "reverse any contiguous sequence of characters that are at that level or higher."
Złóż to razem, a awaria okazuje się deterministyczna, nie losowa. Łaciński człon — nazwa remiksera, feat., Vol. 2, numer katalogowy, rok — siedzi na innym poziomie zagnieżdżenia niż arabski wokół niego. Neutralne na jego granicach (spacja, nawias otwierający) mają arabski z jednej strony i łaciński z drugiej, więc N1 nie znajduje zgodności, a N2 przypisuje im kierunek akapitu. Nawias, który w twoim edytorze pisanym od prawej rozstrzygnął się w jedną stronę, na stronie sklepu pisanej od lewej rozstrzyga się w drugą, odczepia się i przeskakuje.
Zatem نام آهنگ (Nima Remix) nie jest zepsute. To jeden ciąg rozstrzygany w dwóch kontekstach. Kierunek bazowy to kontekst, nie treść, a kontekst sklepu nie jest twoim kontekstem.
Jedyna rzecz, której nigdy nie wolno robić
Nie „naprawiaj” wyświetlania, wpisując znaki od tyłu, aż podgląd wygląda dobrze.
Powstaje wtedy ciąg błędny w kolejności logicznej, poprawny w dokładnie jednym kontekście renderowania i zepsuty wszędzie indziej — łącznie z wyszukiwaniem, sortowaniem, dopasowaniem artysty i każdym sklepem, którego strona ma inny kierunek bazowy niż narzędzie, w którym go „naprawiłeś”. Zamienisz problem wyświetlania, który da się odwrócić, w problem danych, którego się nie da.
UAX #9 rzeczywiście definiuje znaki do jawnego sterowania tym: izolatory LRI, RLI, FSI i PDI oraz znaczniki LRM, RLM i ALM. To technicznie poprawne rozwiązanie. To także niewidoczne znaki formatujące, a wiele łańcuchów dostawy usuwa niewidoczne znaki formatujące, nie mówiąc ci o tym. Traktuj je jako niepewne w polu metadanych.
Poprawka strukturalna: wyprowadź łaciński człon ze środka
Środek zaradczy, który działa wszędzie, w każdym rendererze, bez niewidocznych znaków, jest strukturalny. W kolejności preferencji:
- Używaj osobnych pól zamiast ciągów o mieszanym kierunku wszędzie tam, gdzie model danych je oferuje. Artysta gościnny należy do poziomu roli artysty, nie do tytułu. Music Biz w Music Metadata Style Guide zaleca kredytowanie artystów gościnnych na poziomie roli artysty i nieumieszczanie tych danych w tytule utworu ani wydawnictwa; publiczna wskazówka Spotify brzmi "You shouldn't include any artists' names in your track or release titles." Wersja należy do pola wersji, którego całym zadaniem jest odróżnienie dwóch nagrań o wspólnym tytule. Każdy łaciński człon przeniesiony do własnego pola to granica dwukierunkowa, która przestaje istnieć.
- Trzymaj każdy nieunikniony łaciński człon z dala od pierwszej pozycji. Pierwsza pozycja ustala kierunek akapitu według P2–P3. Perski tytuł otwierany słowem łacińskim jest akapitem od lewej do prawej zawierającym perski, a nie o to ci chodziło.
- Unikaj ozdobnej interpunkcji na granicach kierunku. Myślniki, ukośniki, kreski pionowe i piętrzone nawiasy to neutralne stojące dokładnie tam, gdzie algorytm ma najmniej informacji.
Tam, gdzie umowa naprawdę wymaga tej wzmianki w tytule, konwencje są ustalone i warto trzymać się ich dokładnie. Music Biz o "feat." i "with": "when included in the title are generally lowercase and in English." Przewodnik stylu Apple: "Formatting of 'feat.' and 'with' must be lowercase, in English, not localized, and in parentheses or brackets." To "not localized" wykonuje tu realną pracę — nie tłumacz "feat." na arabski, perski ani urdu w polu tytułu. To token czytany maszynowo, a nie słowo.
Cyfry i dlaczego twoje mogą nie być tymi, o których myślisz
W grze są trzy zestawy cyfr:
| Zestaw | Punkty kodowe | Używany w | Klasa bidi |
|---|---|---|---|
| ASCII | 0–9 | wszędzie | EN |
| arabsko-indyjski | U+0660–U+0669 (٠١٢٣٤٥٦٧٨٩) | arabski | AN |
| rozszerzony arabsko-indyjski | U+06F0–U+06F9 (۰۱۲۳۴۵۶۷۸۹) | perski, urdu | EN |
To nie są warianty stylistyczne. To różne punkty kodowe, które według Unicode Character Database nie dzielą nawet klasy dwukierunkowej. Reguła W2 z UAX #9 przetypowuje European Number na Arabic Number, gdy najbliższy poprzedzający znak silny jest literą arabską, więc wewnątrz tekstu perskiego oba mogą przy wyświetlaniu zachowywać się tak samo — ale nigdy przy sortowaniu, wyszukiwaniu ani porównywaniu ciągów, bo to różne znaki. "Vol. 2" napisane rozszerzoną arabsko-indyjską ۲ i "Vol. 2" napisane cyfrą ASCII 2 to dwa różne ciągi, które wyglądają niemal identycznie.
Wybierz jeden zestaw cyfr na katalog i nigdy nie mieszaj zestawów wewnątrz jednego ciągu.
Jak sprawdzić, co naprawdę wpisałeś
Wyświetlaniu nie można ufać, więc sprawdź bajty. Trzy rzeczy warto zrobić przed każdą dostawą:
- Przeczytaj ciąg jako punkty kodowe, nie jako glify. Każde narzędzie pokazujące wartości U+ powie ci natychmiast, czy to perskie ی (U+06CC), czy arabskie ي (U+064A), perskie ک (U+06A9), czy arabskie ك (U+0643) — rozróżnienie, które większość krojów pisma spłaszcza i którego żaden korektor nie zobaczy. To samo dotyczy zabłąkanego tatweel (U+0640), którego nie usuwa żadna forma normalizacji Unicode, oraz łącznika zerowej szerokości (U+200C), którego pole formularza po cichu zjadło.
- Wklej tytuł w kontekst od lewej do prawej i w kontekst od prawej do lewej, po czym porównaj. Jeśli interpunkcja ląduje w obu miejscach inaczej, masz ciąg o mieszanym kierunku i łaciński człon, który powinien być we własnym polu.
- Porównaj z poprzednim wydawnictwem znak po znaku, nie na oko. Rozdzielone katalogi w piśmie arabskim niemal zawsze biorą się z różnicy niewidocznej: jedno wydawnictwo napisane na perskim układzie klawiatury, następne na arabskim.
Narzędzia Mazufy działają w całości w twojej przeglądarce — żadne audio ani tekst nie są wysyłane — i same ustawiają dir="rtl", gdy tytuł jest pisany od prawej do lewej, więc to, co widzisz przy pisaniu, odpowiada kontekstowi, dla którego ciąg powstał. Na mazufa.com jest też darmowy kontroler metadanych działający na twoim urządzeniu, który wychwytuje kilka z tych niewidocznych przypadków: mieszane zestawy cyfr, tatweel, zabłąkany lub brakujący ZWNJ, arabskie kontra perskie je i kaf oraz ciągi spoza NFC.
Co zrobić przed dostawą
Weź tytuł i nazwę artysty następnego wydawnictwa i zrób cztery rzeczy. Przenieś każdy łaciński człon, który da się przenieść, do własnego pola — artystów gościnnych do roli artysty, wersje do pola wersji. Upewnij się, że nic nie zaczyna się od słowa łacińskiego. Ujednolić zestaw cyfr i usuń każdy tatweel. Potem raz przeczytaj ciąg jako punkty kodowe i zapisz dokładnie ten ciąg jako pisownię kanoniczną, której użyjesz przy każdym przyszłym wydawnictwie, bez przepisywania go od nowa.
Jeśli tytuł mimo wszystko musi nieść łaciński człon w środku, dostarcz go i przyjmij, że w różnych miejscach wyrenderuje się różnie. To skutek wyświetlania, a nie uszkodzenie. Ciąg jest poprawny. Przepisanie go od tyłu, żeby jeden podgląd wyglądał dobrze, to jedyny sposób, by naprawdę go zepsuć.
Źródła
- 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 — właściwości znaków: klasa dwukierunkowa, odwzorowania dekompozycji — 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/
Korpus podaje dla tych dokumentów daty wersji i rewizji wymienione powyżej i nie odnotowuje dla nich osobnej daty odczytu.