Când un titlu în arabă, persană sau urdu ajunge la un magazin cu paranteza pe partea greșită, cu creditul „feat." împins la celălalt capăt sau cu un număr de catalog plutind unde nu ar trebui, nu s-a corupt nimic. Octeții pe care i-ai scris sunt aproape întotdeauna octeții care au ajuns acolo. Ce s-a schimbat este direcția de bază a casetei în care este desenat textul, iar aceasta este hotărâtă de pagina magazinului, nu de titlul tău. Articolul explică mecanismul suficient de precis încât să poți prezice care dintre titlurile tale se vor strica înainte să le livrezi.
Un lucru de spus de la început, fiindcă este poziția cinstită: nu cunoaștem nicio măsurătoare publicată a ratelor de eroare pentru metadatele în scriere arabă, nicăieri în industrie. Problema este trăită de toată lumea și nu este cuantificată deloc. Mai jos nu apare nicio cifră, fiindcă nu există nicio cifră de dat.
Ordinea logică și ordinea de afișare sunt două lucruri diferite
Unicode stochează textul în ordine logică — ordinea în care îl spui, îl scrii și îl citești cu voce tare. Ordinea de afișare este calculată din aceasta la randare, de algoritmul bidirecțional Unicode definit în Unicode Standard Annex #9 (UAX #9). Anexa este directă în privința separării: „The Unicode Standard prescribes a memory representation order known as logical order" și „When working with bidirectional text, the characters are still interpreted in logical order—only the display is affected."
Această singură frază explică fenomenul care îi face pe artiștii care scriu cu alfabet arab să creadă că metadatele lor sunt bântuite: șirul stocat poate fi perfect corect în timp ce afișarea este greșită, și poate arăta corect în timp ce octeții stocați sunt greșiți — iar pe ecran cele două defecte arată identic. Nu poți audita asta uitându-te. Nici agentul de asistență al distribuitorului tău nu poate.
De ce se mută un cuvânt latin dintr-un șir de la dreapta la stânga
UAX #9 dă fiecărui caracter un tip bidirecțional. Literele arabe, persane și urdu sunt AL (litere arabe de la dreapta la stânga). Literele latine sunt L. Cifrele ASCII sunt EN (European Number), cifrele arabo-indice sunt AN (Arabic Number). Spațiile și cea mai mare parte a punctuației — inclusiv parantezele rotunde, cele drepte, cratima și punctul — sunt neutre, adică nu au direcție proprie și o moștenesc din vecinătate.
Două grupuri de reguli fac stricăciunea.
Direcția paragrafului, regulile P2–P3. Algoritmul caută primul caracter direcțional tare și stabilește din el direcția de bază. Un titlu care începe cu un cuvânt latin capătă direcție de la stânga la dreapta, chiar dacă tot ce urmează este în persană.
Rezolvarea neutrelor, regulile N1–N2. Regula N1: „A sequence of [neutrals] takes the direction of the surrounding strong text if the text on both sides has the same direction." Regula N2: neutrele fără consens preiau direcția paragrafului. Apoi regula L2 reordonează pentru afișare — „reverse any contiguous sequence of characters that are at that level or higher."
Pune-le laolaltă și defecțiunea este deterministă, nu întâmplătoare. Un cuvânt latin — numele unui remixer, feat., Vol. 2, un număr de catalog, un an — stă la alt nivel de încorporare decât araba din jurul lui. Neutrele de la marginile lui (spațiul, paranteza deschisă) au arabă pe o parte și latină pe cealaltă, deci N1 nu găsește consens, iar N2 le dă direcția paragrafului. O paranteză care se rezolva într-un fel în editorul tău de text de la dreapta la stânga se rezolvă invers pe pagina unui magazin de la stânga la dreapta, iar paranteza se desprinde și se întoarce.
Așadar نام آهنگ (Nima Remix) nu este stricat. Este un singur șir rezolvat în două contexte. Direcția de bază este context, nu conținut, iar contextul magazinului nu este al tău.
Singurul lucru pe care nu trebuie să îl faci niciodată
Nu „repara" afișarea scriind caracterele invers până când previzualizarea arată bine.
Asta produce un șir greșit în ordine logică, corect în exact un singur context de randare și stricat peste tot în rest — inclusiv la căutare, la sortare, la potrivirea artiștilor și în fiecare magazin a cărui pagină are altă direcție de bază decât instrumentul în care l-ai „reparat". Vei fi transformat o problemă de afișare, care se poate recupera, într-o problemă de date, care nu se poate.
UAX #9 chiar definește caractere pentru controlul explicit al acestui lucru: izolatorii LRI, RLI, FSI și PDI și marcajele LRM, RLM și ALM. Ele sunt soluția corectă din punct de vedere tehnic. Sunt totodată caractere de formatare invizibile, iar multe lanțuri de livrare elimină caracterele de formatare invizibile fără să îți spună. Tratează-le ca nesigure într-un câmp de metadate.
Soluția structurală: scoate cuvântul latin din mijloc
Măsura care funcționează peste tot, în orice randare, fără caractere invizibile, este structurală. În ordinea preferinței:
- Folosește câmpuri separate în loc de șiruri cu direcție mixtă, oriunde ți le oferă modelul de date. Un artist invitat aparține nivelului de rol al artistului, nu titlului. Ghidul Music Biz, Music Metadata Style Guide, recomandă creditarea artiștilor invitați la nivelul rolului de artist și nu adăugarea acelor date în titlul piesei sau al lansării; indicația publică a Spotify este „You shouldn't include any artists' names in your track or release titles." O versiune aparține câmpului de versiune, a cărui întreagă sarcină este să deosebească două înregistrări care au același titlu. Fiecare cuvânt latin pe care îl muți în câmpul lui este o graniță bidirecțională care încetează să existe.
- Ține orice cuvânt latin inevitabil în afara primei poziții. Prima poziție stabilește direcția paragrafului conform P2–P3. Un titlu persan care începe cu un cuvânt latin este un paragraf de la stânga la dreapta care conține persană, ceea ce nu ai vrut.
- Evită punctuația decorativă la granițele de direcție. Liniile de pauză, barele oblice, barele verticale și parantezele suprapuse sunt neutre așezate exact acolo unde algoritmul are cele mai puține informații.
Acolo unde un contract chiar cere creditarea în titlu, convențiile sunt fixe și merită urmate întocmai. Music Biz, despre „feat." și „with": „when included in the title are generally lowercase and in English." Ghidul de stil Apple: „Formatting of 'feat.' and 'with' must be lowercase, in English, not localized, and in parentheses or brackets." Acel „not localized" face aici o treabă adevărată — nu traduce „feat." în arabă, persană sau urdu într-un câmp de titlu. Este un simbol citibil de mașină, nu un cuvânt.
Cifrele și de ce ale tale s-ar putea să nu fie cele la care te gândești
Sunt în joc trei seturi de cifre:
| Set | Puncte de cod | Folosit în | Clasă bidi |
|---|---|---|---|
| ASCII | 0–9 | peste tot | EN |
| Arabo-indice | U+0660–U+0669 (٠١٢٣٤٥٦٧٨٩) | arabă | AN |
| Arabo-indice extinse | U+06F0–U+06F9 (۰۱۲۳۴۵۶۷۸۹) | persană, urdu | EN |
Acestea nu sunt variante stilistice. Sunt puncte de cod diferite și, conform Unicode Character Database, nu împart nici măcar clasa bidirecțională. Regula W2 din UAX #9 retipează un număr european ca număr arab atunci când cel mai apropiat caracter tare precedent este o literă arabă, așa că în interiorul textului persan cele două se pot comporta la fel la afișare — dar niciodată la sortare, la căutare sau la compararea șirurilor, fiindcă sunt caractere diferite. Un „Vol. 2" scris cu un ۲ arabo-indic extins și un „Vol. 2" scris cu un 2 ASCII sunt două șiruri diferite care arată aproape identic.
Alege un singur set de cifre pe catalog și nu amesteca niciodată seturile în interiorul aceluiași șir.
Cum verifici ce ai scris de fapt
Afișarea nu poate fi crezută, așa că verifică octeții. Merită făcute trei lucruri înainte de fiecare livrare:
- Citește șirul ca puncte de cod, nu ca glife. Orice instrument care îți arată valori U+ îți spune pe loc dacă acela este un ی persan (U+06CC) sau un ي arab (U+064A), un ک persan (U+06A9) sau un ك arab (U+0643) — o distincție pe care cele mai multe fonturi o aplatizează și pe care niciun corector nu o poate vedea. La fel pentru un tatweel rătăcit (U+0640), pe care nicio formă de normalizare Unicode nu îl elimină, și pentru un non-joiner de lățime zero (U+200C) pe care un câmp de formular l-a înghițit în tăcere.
- Lipește titlul într-un context de la stânga la dreapta și într-unul de la dreapta la stânga și compară. Dacă punctuația cade diferit în cele două, ai un șir cu direcție mixtă și un cuvânt latin care ar trebui să fie în câmpul lui.
- Compară cu lansarea ta anterioară, caracter cu caracter, nu din ochi. Cataloagele rupte în scrierea arabă sunt aproape întotdeauna cauzate de o diferență invizibilă: o lansare scrisă pe o tastatură persană, următoarea pe una arabă.
Instrumentele Mazufa rulează integral în browserul tău — nu se încarcă niciun fișier audio și niciun text — și pun automat dir="rtl" atunci când un titlu este de la dreapta la stânga, așa că ce vezi în timp ce scrii corespunde contextului pentru care a fost scris șirul. mazufa.com găzduiește și un verificator de metadate gratuit care rulează pe propriul tău dispozitiv și semnalează mai multe dintre cazurile invizibile: seturi de cifre amestecate, tatweel, ZWNJ rătăcit sau lipsă, yeh și kaf arab față de persan și șiruri care nu sunt în NFC.
Ce faci înainte să livrezi
Ia titlul și numele de artist ale următoarei tale lansări și fă patru lucruri. Mută în câmpul propriu fiecare cuvânt latin pe care îl poți muta — artiștii invitați la rolul de artist, versiunile în câmpul de versiune. Asigură-te că nimic nu începe cu un cuvânt latin. Uniformizează-ți setul de cifre și scoate orice tatweel. Apoi citește o dată șirul ca puncte de cod și salvează exact acel șir ca ortografie canonică pe care o vei refolosi la fiecare lansare viitoare, fără să o rescrii.
Dacă un titlu tot trebuie să poarte un cuvânt latin la mijloc, livrează-l și acceptă că va fi randat diferit în locuri diferite. Acesta este un rezultat de afișare, nu o stricăciune. Șirul este corect. Rescrierea lui invers ca să arate bine într-o singură previzualizare este singura cale de a-l face cu adevărat greșit.
Surse
- 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 — proprietăți ale caracterelor: clasă bidirecțională, mapări de descompunere — 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/
Corpusul dă datele de versiune și de revizuire pentru aceste documente, așa cum sunt enumerate mai sus, și nu consemnează o dată separată de consultare pentru ele.