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).