Autor Téma: čeština v Lazarusu  (Přečteno 3574 krát)

Offline miland395

  • Příspěvků: 5
  • Karma: 0
    • Verze Delphi: D5, Lazarus
čeština v Lazarusu
« kdy: 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??

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1146
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:čeština v Lazarusu
« Odpověď #1 kdy: 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.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:čeština v Lazarusu
« Odpověď #2 kdy: 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
« Poslední změna: 05-01-2014, 19:15:34 od oxo »
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:čeština v Lazarusu
« Odpověď #3 kdy: 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;
Embarcadero Technology Partner

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1146
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:čeština v Lazarusu
« Odpověď #4 kdy: 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 ;)