Forum Delphi.cz

FreePascal (FPC) a Lazarus => Obecné => Téma založeno: miland395 05-01-2014, 16:13:37

Název: čeština v Lazarusu
Přispěvatel: miland395 05-01-2014, 16:13:37
Používám Delphi a zde jsem nikdy neměl žádný problém s použitím českých specických znaků.
Při použití Lazarusu jsem však narazil na dost zásadní problém:

Jestliže např. do řetezcové proměnné uložím text obsahující české znaky a pak chci tento řetězec procházet znak po znaku a s jednotlivými znaky něco dělat, zdá se, jako by tyto znaky zabíraly 2 pozice.

Takže když třeba použiji funkci Pos na zjištění pozice podřetězce v řetězci, tak to nevrátí správnou hodnotu, ale hodnotu, v níž se každý "český znak" projeví 2 krát
(např Pos ('ka' , 'žárovka') vrátí 8 místo očekávaných 6).

Zřejmě nezávisí na verzi Win, na kterých se Lazarus provozuje. Možná souvisí s Unicode, ale jak??
Název: Re:čeština v Lazarusu
Přispěvatel: < z > 05-01-2014, 16:27:02
Bohuzel nevim, proc to takhle dela, a Lazarus se mi instalovat nechce.
Ale problem urcite souvisi s unicode. 8 znaku zabira ten text, protoze pouziva UTF-8 a "ž" zabere 2 mistecka.

Je ale otazkou, proc to tak divne hleda, jako kdyby to ta funkce hledala v ANSI stringu a ne v UTF.
Zkontroluj si parametry, ktere ta funkce bere a jestli se tam ten string nejak nemeni na jiny typ.
Název: Re:čeština v Lazarusu
Přispěvatel: Ondřej Pokorný 05-01-2014, 19:13:25
<z> má v jednom pravdu: Lazarus používá na vše UTF-8 a se stringy se i tudíž musí pracovat jinak než v Delphi. Pozice a délka v UTF-8 tak neodpovídá opravdové pozici/délce.
V druhém už pravdu nemá, funkce Pos() vrací správně pozici 8, to není chyba. Ještě tam je dlouhé "á" a to taky zabere 2 místa.

Pokud potřebuješ opravdovou pozici, délku a pod. ze stringu v Lazarusu, používej UTF8* funkce z unity "lazutf8.pas":

Kód: [Vybrat]
pozice := UTF8Pos('ka', 'žárovka');
delka := UTF8Length('žárovka');

Viz: http://wiki.freepascal.org/LCL_Unicode_Support#UTF-8_String_Copy.2C_Length.2C_LowerCase.2C_etc (http://wiki.freepascal.org/LCL_Unicode_Support#UTF-8_String_Copy.2C_Length.2C_LowerCase.2C_etc)
Název: Re:čeština v Lazarusu
Přispěvatel: Ondřej Pokorný 05-01-2014, 19:29:27
A ještě doplnění. S UTF-8 je například při iteraci doopravdy špatné pořízení. V tom případě použij UnicodeString, který odpovídá typu String v Delphi 2009+. Nezapomeň ale, že musíš používat UTF8Encode/UTF8Decode pro konverzi:

Kód: [Vybrat]
var
  SourceString, SubString: UnicodeString;
  I: Integer;
begin
  SourceString := UTF8Decode('žárovka');
  SubString := UTF8Decode('ka');
  ShowMessage(IntToStr(Pos(SubString, SourceString)));//vyhodí 6

  for I := 1 to Length(SourceString) do
    ShowMessage(UTF8Encode(UnicodeString(SourceString[I])));//iterace přes všechny znaky
end;
Název: Re:čeština v Lazarusu
Přispěvatel: < z > 05-01-2014, 19:57:51
pardon, ja tam videl tu 8 a ruce psaly neco jineho, nez sem chtel napsat ja ... melo to byt 9, za kazde ne-ANSI +1 navic ;)