Funkcja Length w Lazarusie

0

W Lazarusie mam problem z funkcją zwracającą ilość znaków z obiektów String.
Polskie znaki diaktryczne zwraca w podwojonej ilości.

 Label1.Caption:='azl';
 ShowMessage(IntToStr(Length(Trim(Label1.Caption)))); //zwraca 3
 Label1.Caption:='ążł';
 ShowMessage(IntToStr(Length(Trim(Label1.Caption)))); //zwraca 6

Zna ktoś rozwiązanie tego problemu ? strona kodowana w UTF-8.

4
amprogramming napisał(a):

Polskie znaki diaktryczne zwraca w podwojonej ilości.

Nie nie nie. Po pierwsze, wszystkie polskie znaki diakrytyzowane w UTF-8 zajmują po dwa bajty każdy. A po drugie, literał np. ą nie jest znakiem, a ciągiem znaków – właśnie ze względu na swój dwubajtowy rozmiar. Z tego wynika np., że nie można literału ą przypisać do zmiennej typu Char – bo mamy niezgodność typów, co jest logiczne.

Tak więc funkcja Length działa jak najbardziej prawidłowo – zwraca długość ciągu znaków w bajtach, bo takie jest jej zadanie. Jeśli potrzebujesz określić liczbę znaków (a nie bajtów) to skorzystaj z funkcji UTF8Length z modułu LazUTF8.

// długość w bajtach
ShowMessage(IntToStr(Length(Trim('azl')))); // 3
ShowMessage(IntToStr(Length(Trim('ążł')))); // 6

// długość w znakach
ShowMessage(IntToStr(UTF8Length(Trim('azl')))); // 3
ShowMessage(IntToStr(UTF8Length(Trim('ążł')))); // 3

strona kodowana w UTF-8.

UTF-8 to jest kodowanie, nie strona kodowa. Jeśli masz problem z rozróżnieniem tych dwóch pojęć to zapamiętaj, że kodowanie określa format danych (m.in. ile bajtów zajmują codepointy), a strona kodowa określa zawartość tych danych (przyporządkowanie znaków do kodów liczbowych).

Strony kodowe mają swoje oznaczenia, np. CP-1250 dla kodowania Ansi (alfabet łaciński).

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