Arabiško teksto vaizdavimas

Posted: 2015-10-24 in Pezalai
Žymos:, ,

Teko susidurti su arabiško teksto vaizdavimu. Ir ne tai kad ten CSS stiliukus parankiot, o tokiam gan žemam lygyje: kaip sukišti arabišką tekstą į LCD ekraniuką.

Kaip žinote, arabiškas tekstas eina iš dešinės į kairę (RTL — right to left). Čia pirma problema. Kompiuterius kadaise išgalvojo amerikonai, todėl viskas juose keliauja iš kairės į dešinę, kaip mums, vakariečiams yra įprasta (LTR — left to right). Pirmieji bandymai vaizduoti arabiškus rašmenis susidėdavo iš atitinkamo šrifto ir baitų įrašymo „atvirkštine“ seka bei pritaikant dešininį lygiavimą.


Šiais laikais tokių nesąmonių nebėra, unikodo standartai sutvarkė daugumą problemų. Na, sakykim, vartotojams jau problemų kyla nedaug. Net ir primityvios tekstų redagavimo programos moka gražiai pavaizduoti „apsuktą“ tekstą, ką jau kalbėti apie visokias naršykles.

Teksto „paišymo“ varikliams tuo tarpu tenka nemenkas uždavinukas, kaip teisingai pavaizduoti arabišką tekstą, ypač, jei jame yra įterpta angliškų (ar kitokių ten) citatų. Na, kai RTL tekstas maišomas su LTR.

Primityvus pavyzdukas:

„Čia yra ARABIŠKAS žodis“.

Sakykim, kad „ARABIŠKAS“ turi būti tikrai arabiškas. Tai teksto vaizdavimo variklis teisingai einančius baitus turi suvaizduoti va šitaip:

„Čia yra SAKŠIBARA žodis“.

Aukščiau esančią eilutę aš perrašiau dėl vaizdumo. Tačiau realybėje, jei tas žodis iš tikrųjų būtų parašytas arabiškais rašmenimis, tai vaizdavimo variklis jį turėtų tinkamai „apsukti“ ir tinkamai įterpti į vakarietišką tekstą. Ir atvirkščiai būtų arabiškame tekste su vakarietiškais įterpiniais.

Na, iki čia viskas aišku. Turim LCD ekraniuką, kuris turi arabiškus šriftus. Automatinio apsukimo jis nemoka padaryti, nes yra per durnas, taigi teksto eilutes su arabiškais rašmenimis reikia programinėj įrangoj apsukinėti mums, programuotojams.

Ką gi, bandymas atliekamas. Nusikopijavau iš Vikipedijos arabiškų rašmenukų. LCD ekraniukas priima UTF-16 BE (dviejų baitų) koduotę:

Arabiškas tekstas iš Vikipedijos | Darau, blė

Kaip ir viskas ok. Su HEX redaktorium pasižiūrėjau kodukus, susikonstravau testinę eilutę, ją apsukau ir pasiunčiau į ekraniuką. O jis, suka, tekstą vaizduoja panašiai, nu bet kažkaip ne taip:

Neteisingai pavaizduotas arabiškas tekstas su izoliuotomis raidėmis | Darau, blė

Kaip ir panašu, kaip ir ne. Bėda. Ką gi, einam šiek tiek aiškintis ir iš gamintojo reikalauti LCD datašytų ir kabinėtis. Nes, nors aš apie arabų kalbą neraukiu nieko, nujaučiu, kad toks vaizdavimas nėra labai jau geras. Vienas arabiškas ekspertas patvirtino: jo, čia blogai pavaizduota.

Gaunam datašytą ir matau, kad arabiškos raidės turi unikodo rėžį nuo U+0600 iki U+06FF. Ok. Tai sutampa su mano pastebėtais unikodo simboliais. Ale va, ten raidės yra „neteisingos“. Tai kaip čia yr?

Iš smalsumo teko truputuką pasimokyti apie arabiškus rašmenis. Kaip minėjau, iki šiol apie arabų kalbą ir rašmenis neraukiau nieko. Na, išskyrus gal tai, kad jie daugiausiai tekstą užrašinėja priebalsėmis praleidinėdami balsius — bet čia jau visai kita istorija.

Taigi trumpai tariant, arabiškos raidės turi keturias formas. Na, ne visos, bet didelė jų dalis. „Izoliuota“ forma yra naudojama tada, kai raidė užrašoma pavieniui. Ką matome antrame paveikslėlyje — ten yra „izoliuoti“ raidžių „snukeliai“. Po to yra pradžios, pabaigos ir vidurio formos — pagal tai, kurioje žodžio vietoje raidė yra. Ir tai dar susiję su tuo, ar raidė gali būti tam tikroje formoje sujungta su kita raide — kad gautųsi ištisinis kringelis (kaip pirmame paveikslėlyje). Na, ir be šito gėrio dar yra ligatūros — kai kurios raidės susiplaka į vieną bendrą „snukelį“. Mums, europiečiams, yra gan dažnai sutinkama ir pažįstama ligatūra Æ, sudaryta iš raidžių „A“ ir „E“. Vokiečių besimokiusiems pažįstamas eszetas — ß, sudarytas, kaip sako pavadinimas, iš „s“ ir „z“.

Skirtumas tas, kad visos raidžių formos užkoduojamos viena koduote. Sakykim, taip būtų ir mūsų europietiškose kalbose, jei didžiosios ir mažosios raidės būtų užkoduotos viena kodų lentele, tačiau didžiųjų ir mažųjų vaizdavimas būtų kontekstinis — pavyzdžiui, didžiosios sakinio pradžioje ar prie tam tikrų daiktavardžių. Na, bet vakarietiškų raidžių yra nedaug ir praktiškiau yra jas koduoti atskirais kodais. Tuo tarpu arabiškuose tekstuose yra priešingai — patogiau raides koduoti vienu kodu, paliekant kontekstinį vaizdavimą jau „paišymo“ varikliams.

Smagumas yra tame, kad skirtingi raidžių ir ligatūrų „snukeliai“ turi savo vietą unikodo lentelėje. Konkrečiai arabų kalbai tai yra „Presentation Form-B“ rėžyje U+FE70—U+FEFF. Bet šiukštu, šitų unikodo simbolių naudoti tiesiogiai tekstui koduoti negalima. Juos iš šrifto pagal raidės vietą žodyje ar sakinyje turi parinkti teksto vaizdavimo varikliukas. Taip pat ir su ligatūromis. Vakarietiškos ligatūros turi atskirus kodus ir juos reikia įrašyti norint ligatūrą išgauti. Arabiškos ligatūros turi būti „nupiešiamos“ automatiškai radus atitinkamą dviejų raidžių sandūrą.

Taigi va, štai ir programavimo uždavinys. Unikodu koduotą arabišką tekstą teisingai pavaizduoti jį „apsukant“ bei parenkant kontekstines raidžių formas. Ligatūrų reikės, berods, keturių. Tiksliau, vienos, lām + alif su hamza viršuj bei apačioj ir su madda. Čia tokie papildomi kringeliai 🙂

Radau vieną biblioteką, parašytą OS X sistemai su Objective C. Ar ja pasinaudosime — nežinau, kol kas dar per anksti spręsti. Manau, kad ją nesunku būtų perdaryti į normalią C.

Be to, sėkmingai pavyko du pavyzdinius ekranėlius kaip tai susvilinti, dabar reikės laukti naujų. Tam kartui arabiški rašmenys pagulės nuošalėje.

Zia pabaiga.

˙ǝ̣ꞁq ‘sᴉuǝɯs̭ɐɹ snʞs̭ᴉqɐɹɐ ǝᴉdɐ sᴉusdᴉɐɹʇs ouɐɯ ɐɹʎ ‘ǝɾoᴉɔ̭ɐdɐ nɐᴉs̭ɐɹɐd ɐ͗ʞ ‘sɐʞsᴉɅ

Komentarai
  1. interfunk parašė:

    SIKŠABARA error !

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Pakeisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Pakeisti )

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.