Arabskie znaki w Lazarus błędne rysowanie znaków w zaleznosci od pozycji w słowie

0

Próbuje wyświetlić tekst : "سطوع 1"
w aplikacji napisanej w Lazarus
powinno to wyglada tak:
screenshot-20240415145624.png
A wyglada tak:
screenshot-20240415145644.png

https://arbfonts.com/the-sans-plain-3-font-download.html?preview=%D8%B3%D8%B7%D9%88%D8%B9+1
W słowie arabskim ostatnia litera po prawej ma ciekawą właściwość
w zależności gdzie jest w słowie to wygląda inaczej

screenshot-20240415145229.png
screenshot-20240415145322.png

Jak ta funkcja się nazywa ze znak może różnie wyglądać i czy można to jakoś włączyć w lazarus aby poprawnie wyświetlał teksty arabskie ?
Bo z tego co widzę ze lazarus jest zafiksowany i wyświetla literę w jeden sposób niezalezienie gdzie jest w słowie

1

U mnie wygląda poprawnie, test w etykiecie przy domyślnych ustawieniach:

screenshot-20240415152630.png

Nie poprzestawiałeś sobie czegoś w komponentach? No i która wersja Lazarusa?

1

ostatnio szukałem czegoś podobnego i dotarłem do info, że trzeba coś ustawić w systemie związanego właśnie z tą zamianą (między cyckiem a małym ogonkiem z przodu tego "w") ale za cholerę nie mogę znaleźć co to było

1
abrakadaber napisał(a):

ostatnio szukałem czegoś podobnego i dotarłem do info, że trzeba coś ustawić w systemie związanego właśnie z tą zamianą (między cyckiem a małym ogonkiem z przodu tego "w") ale za cholerę nie mogę znaleźć co to było

Dlatego warto olać Lazarusa i po prostu wstawić jak na wiki obrazek. Grafika rastrowana jest prosta nawet w Delphi.

1

Olać to można (i wręcz należy) twój post. Lokalizacji interfejsu nie robi się obrazkami, bo to nie gry na NES-a.

1
furious programming napisał(a):

Olać to można (i wręcz należy) twój post. Lokalizacji interfejsu nie robi się obrazkami, bo nie gry na NES-a.

Jeśli wewnętrzny renderer jest na tyle ograniczony (lub zabugowany) jeśli chodzi o lokalizację pewnych bardziej egzotycznych języków/reguł to jak najbardziej się to robi bo satysfakcja końcowego klienta stoi wyżej niż odczucia szeregowego deva.

1

Jeśli nie masz nic mądrego do napisania, to się nie udzielaj. Bo na razie jak widzę jedynie nabijasz bezsensowne posty. Jeśli nie przestaniesz tego robić, to po prostu będę usuwał twoje posty, bo to zwykły off-top. Nie znasz się, nie umiesz pomóc, to nie dotykaj klawiatury. Więcej ostrzegać nie będę, więc się opanuj.

Mowa jest o Lazarusie, komponentach wchodzących w skład biblioteki LCL i o obsłudze UTF-8, nie o żaden ”wewnętrzny renderer”, egzotyczne języki i szeregowego deva, więc na tym się skupmy.

0

@furious programming: ja tez sprawdziłem na innych platformach i wszędzie rysuje sie poprawnie, tutaj to prawdopodobnie jakaś wina starego GTK który odpowiada za finalne rysowanie na moim Linux embedded. Albo wina jakiś globalnych ustawień albo dlatego że system operacyjny ma z 8 lat i może tam kiedyś byly jakieś błedy.

1

Jeśli chodzi o renderowanie tekstu, to bez względu na platformę, LCL wykorzystuje funkcje z systemowego API/bibliotek, zarówno do samego pomiaru tekstu, jak i do jego wyrenderowania. Czyli w skrócie, LCL nie posiada własnego renderera tekstu.

Powodów niepoprawnej obsługi renderowania Unikodu może być wiele, w tym nieaktualny LCL, w którym zbudowano aplikację lub po prostu nieaktualny system/biblioteki. Żeby móc coś więcej napisać, pasowałoby abyś podał szczegółowe informacje na temat systemu operacyjnego oraz wersji Lazarusa, która była użyta do kompilacji tej aplikacji.

0

Zbadałem czcionkę aby wykluczyć jeden problem
i widzę 4 warianty znaku:
seen-arab
seen-arab.fina
seen-arab.init
seen-arab.medi

screenshot-20240415204032.png

na razie mam koncept na "łopatologiczne/brutalne" obejście problemu:

  • przefiltrować teksty i podmienić znaki w zależności od pozycji np. znak $FEB1 jak jest w środku to zamieniam na znak $FEB4,
0

zbudowałem lazarusa+fpc w aktualnych stabilnych wersjach i problem się nie rozwiązał
wiec to raczej wina systemu albo ustawień w nim :(

2

A jaki to konkretnie system jest? Ponieważ na Debian 12 jest ok:
screenshot-20240416150110.png

2
Marius.Maximus napisał(a):

Albo wina jakiś globalnych ustawień albo dlatego że system operacyjny ma z 8 lat i może tam kiedyś byly jakieś błedy.

Raczej tutaj szukałbym przyczyny. Trzeba zaktualizować system i sprawdzić ponownie. 😉

0

ten projekt to ma ponad 10 lat i wtedy jeszcze nie było Wayland w embedded a przynajmniej nie u mnie
wiec mam xorg + gtk2 , kilkanaście języków w tym chiński i koreański

co do wersji systemu operacyjnego to trudno dokładnie powiedzieć bo to wszystko jest zbudowane z przepisów open embedded
mogę znaleźć wersję dowolnego pakietu ale jakbym miał to odnieść do jakiegoś ubuntu to będzie trudno ,
jest tak stare ze kernel ma wersje 2.4 ;)

musiał bym się pokusić o jakieś hello world w czystym gtk2 aby potwierdzić koncepcję ze to system a nie fpc, ale to nie rozwiązuje problemu

Jedyne rozwiązanie jakie widzę to napisać własny TLabel i narysować znaki tak jak mają być , w linku który podał @abrakadaber jest tabela która można użyć do odpowiedniego mapowania znaków

1

A co tam jest odpowiedzialne za układanie znaków?
Pango? HarfBuzz?
Może potrzebna jest nowsza wersja?

0

@-daniel-: z tego co kojarzę to pango + cario, HarfBuzz to chyba jakaś nowość ?
Nie chcę modyfikować pakietów w systemie , raczej obejść problem

Eksperymentalnie zrobiłem test w którym zamiast znaków arabskich "pisanych" U+0600 ..U+06FF użyłem znaków "rysowanych" U+FE70 - U+FEFF

ws: WideString;     
ws := UTF8ToUTF16("سطوع 1");   
// podmieniam litery z zakresu U+06xx na zakres  U+FE70 - U+FEFF
// i potem 
label1.captiion := UTF16ToUTF8(ws) 

i narysowało się poprawnie wiec koncept działa , tylko trzeba zakodować reguły języka arabskiego bo litery maja od 2 do 5 form a to juz nie jest hop siup

Zastanawiam się czy jest jakiś mechanizm ,
może być nawet na Windows (bo chodzi mi tylko o wygenerowanie zasobów)
aby tekst napisany w języku arabskim w którym są znaki z zakresu U+0600 ..U+06FF https://unicodeplus.com/bidiclass/AL
zamienić na tekst zawierający finalne znaki rysowane U+FE70 - U+FEFF https://unicodeplus.com/block/FE70

1

Reguły są zakodowane w bibliotekach właśnie. Możesz podglądnąć, albo szukać jakiś kawałków kodu w internecie.
Pod Windows biblioteka DirectWrite/Uniscribe to robi, ale chyba dostaniesz się tylko do glyph indeksów zamiast kodów znaków.

2

@-daniel-: dziękuje za linki widzę że ten drugi bazuje na tym samym rozwiązaniu co ja wybrałem

Znalazłem projekt na github https://github.com/Accorpa/Arabic-Converter-From-and-To-Arabic-Presentation-Forms-B
i przepisałem na pascal-a
https://github.com/mariuszmaximus/Arabic-Converter-From-and-To-Arabic-Presentation-Forms-B/blob/main/arabicconverter.pas

1 użytkowników online, w tym zalogowanych: 0, gości: 1