Funkacja kompiluje się w Delphi a w Lazarusie już nie.

Odpowiedz Nowy wątek
2019-12-01 18:20
0
function PL (lancuch : string) : string;
var tmp  : string;
i : integer;
begin
for i := 1 to lancuch.Length do
   case lancuch[i] of
   '¹' : tmp:=tmp + 'ą';
   'æ' : tmp:=tmp + 'ć';
   'ê' : tmp:=tmp + 'ę';
   '³' : tmp:=tmp + 'ł';
   'ñ' : tmp:=tmp + 'ń';
   'ó' : tmp:=tmp + 'ó';
   'œ' : tmp:=tmp + 'ś';
   '¿' : tmp:=tmp + 'ż';
   'Ÿ' : tmp:=tmp + 'ź';
   '¥' : tmp:=tmp + 'Ą';
   'Æ' : tmp:=tmp + 'Ć';
   'Ê' : tmp:=tmp + 'Ę';
   '£' : tmp:=tmp + 'Ł';
   'Ñ' : tmp:=tmp + 'Ń';
   'Ó' : tmp:=tmp + 'Ó';
   'Œ' : tmp:=tmp + 'Ś';
   '¯' : tmp:=tmp + 'Ż';
   '' : tmp:=tmp + 'Ź';
   else tmp:=tmp+lancuch[i];
   end;
Result := tmp;
end;

W Lazarusie mam komunikat "constant and case types do not match". W Delphi jest okej.

edytowany 2x, ostatnio: furious programming, 2019-12-01 21:36

Pozostało 580 znaków

2019-12-01 18:26
0

'' : tmp:=tmp + 'Ź'; - pusty znak?
Po za tym zawsze zadziała:

case Ord(lancuch[i]) of
    Ord('¹') : ..

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2019-12-01 18:37
0

Kompilacja zatrzymuje się na

ord('¹') : tmp:=tmp + 'ą';

Ordinal expression expected.
Natomiast

ord('a') : tmp:=tmp + 'ą';

działa. Nie rozumiem tego. Może edytor nie rozpoznaje tych znaczków jako litery?

edytowany 5x, ostatnio: furious programming, 2019-12-01 21:36

Pozostało 580 znaków

2019-12-01 19:43
0

Te znaczki działają pod Delphi jak przestawisz formę na kodowanie UTF8. Nie wiem jak to się robi w Lazarusie ale zapewne także trzeba przełączyć się na kodowanie UTF8.
Poza tym zamiast wpisywać takie krzaczki w których łatwo się pomylić lepiej użyć funkcji Chr(kod_ASCII), czyli:
zamiast:

case lancuch[i] of
   '¹' : tmp:=tmp + 'ą';

napisz:

case lancuch[i] of
   Chr(185) : tmp:=tmp + 'ą';
#185 jest krócej. - furious programming 2019-12-01 21:36

Pozostało 580 znaków

2019-12-01 21:15
0

Dziękuję za podpowiedź. Działa.

Pozostało 580 znaków

2019-12-01 21:25
3
didzni napisał(a):

W Lazarusie mam komunikat "constant and case types do not match". W Delphi jest okej.

Błąd ten jasno informuje o źródle problemu – typy danych się różnią, co nie jest dopuszczalne. Wszystko dlatego, że lancuch[i] zwraca jednobajtowy znak, a literał np. 'æ' to dwubajtowy ciąg znaków – stąd błąd kompilacji.

Nie wiem po jaką cholerę sam piszesz taką funkcję, skoro są już gotowe, np. AnsiToUtf8 z modułu LazUTF8.… :/

robertz68 napisał(a):

Nie wiem jak to się robi w Lazarusie ale zapewne także trzeba przełączyć się na kodowanie UTF8.

UTF-8 jest natywnym kodowaniem – nie trzeba niczego przełączać. Chyba że na ANSI, to wtedy najpewniej zatrybi bez żadnych zmian w kodzie, ale i tak odradzam takich praktyk.


edytowany 13x, ostatnio: furious programming, 2019-12-01 21:53

Pozostało 580 znaków

2019-12-01 22:18
0

OK, ale dlaczego w Delphi ta funkcja działa bez żadnych dodatkowych zabiegów? Może szablon string jest inaczej napisany? Mogę normalnie porównać literał z pojedynczym znakiem wyjętym ze stringa indeksem.

Pozostało 580 znaków

2019-12-01 23:11
0
didzni napisał(a):

OK, ale dlaczego w Delphi ta funkcja działa bez żadnych dodatkowych zabiegów?

Bo Delphi, którego używasz, obsługuje kod źródłowy w postaci jednobajtowego ANSI, dlatego każdy z literałów wewnątrz instrukcji wyboru jest zwykłym znakiem (a nie łańcuchem) i możesz go porównać do innego znaku. Albo obsługuje unikod, a podane w instrukcji wyboru literały traktowane są jako unikodowe znaki.

Skąd mam wiedzieć – nie napisałeś o które Delphi chodzi…


edytowany 2x, ostatnio: furious programming, 2019-12-01 23:46

Pozostało 580 znaków

2019-12-02 07:03
0

10.3.3

Pozostało 580 znaków

2019-12-02 18:48
0

@didzni: sprawdź poniższy kod i daj znać co wyskoczy w konsoli:

WriteLn(Length(Char('æ')));
WriteLn(Length(String('dæb')));

W Lazarusie (bez rzutowania) jest to 2 i 4, czyli prawidłowo – zgodnie z UTF-8.

Jeśli dobrze rozumiem dokumentację to ta wersja Delphi domyślnie wykorzystuje typ UnicodeString w postaci UTF-16, więc powinieneś w konsoli zobaczyć 1 i 3.


edytowany 8x, ostatnio: furious programming, 2019-12-02 19:01
Coś takiego zwróci 1, 3 dopiero jawne rzutowanie na UTF-8 czyli coś takiego WriteLn(Length(Utf8String('æ'))); zwróci odpowiednio 2 i 4 - kAzek 2019-12-02 19:00
Ach, zaplątałem się – oczywiście powinno być 1 i 3. Poprawiam, dzięki. - furious programming 2019-12-02 19:01

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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