Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Dauerbrenner Umlaute: Lazarus vs. Delphi (https://www.delphipraxis.net/176311-dauerbrenner-umlaute-lazarus-vs-delphi.html)

Phillie08 26. Aug 2013 19:41

Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Hallo,

da mir schon einmal hier geholfen werden konnte, als es um Umlaute ging, versuche ich mein Glück erneut.
Ich schreibe ein Programm, bei dem einzelne Buchstaben verarbeitet werden müssen, die Algorithmen sind kein Problem, aber Lazarus weigert sich zu kompilieren.
Hier ist ein winziger (und schwachsinniger), aber entscheidender Code-Schnipsel:
Code:
procedure test;
var
  Z: char;
begin
  Z := 'a';
  Z := 'ß'; //Hier wird Fehler gefunden, ebenso nächste Zeile
  Z := 'ö';
end;
In Delphi funktioniert das, Lazarus meldet folgenden Fehler:
Code:
unit1.pas(48,8) Error: Incompatible types: got "Constant String" expected "Char"
Offenbar wird 'ä' usw. nicht als Zeichen, sondern als Zeichenkette interpretiert.
Ich schätze, dass da wieder mal diese UTF-Geschichte herein spielt.
Ob wohl jemand eine Idee hat, wie ich es hin bekommen könnte, Umlaute und ß als Einzelzeichen verarbeiten zu können? Der Umweg über ä=ae geht natürlich immer, ist hier aber ausdrücklich nicht erwünscht.

Ich arbeite mit Lazarus 1.0.8 unter Windows.

cookie22 26. Aug 2013 20:36

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
High Ascii wird in Fpc als String interpretiert.

Warum nicht:
Delphi-Quellcode:
procedure test;
var
  Z: string;
begin
  Z := 'a';
  Z := 'ß'; //Hier wird Fehler gefunden, ebenso nächste Zeile
  Z := 'ö';
end;

ringli 26. Aug 2013 20:41

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Im Lazarus-Forum habe ich die Funktion UTFToChr gefunden. Vielleicht hilft dir die:
Delphi-Quellcode:
function UTFToChr(const s: string): char;
begin
  if s='' then result:=char(0)
  else begin
    {$IFnDEF fpc}result:=s[1];{$ELSE}
    case byte(s[1]) of
      194: result:=char((byte(s[2])-163)+128);
      195: result:=char((byte(s[2])-130)+160);
      226: result:=char(255);
      else result:=s[1];
    end;{$ENDIF}
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Z: char;
begin
  Z := 'a';
  Z := UTFToChr('ß'); //Hier wird Fehler gefunden, ebenso nächste Zeile
  Z := UTFToChr('ö');
end;
Zumindest kompiliert Lazarus so den Code.

cookie22 26. Aug 2013 20:48

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Da kannst du die Chars dann gleich mit dem Ascii Code aufrufen. Im Falle von ß dann #225;

Ginko 26. Aug 2013 21:08

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Hi !
Delphi-Quellcode:
uses LCLType;

procedure test;
var
  Z: TUTF8Char;
begin
  Z := 'a';
  Z := 'ß';
  Z := 'ö';
end;
wäre auch ne Möglichkeit.

MfG

MeierZwoo 26. Aug 2013 21:46

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Kennt Lazerus keine AnsiChar? Denn Du willst ja AnsiChar (1 Byte Chars) und keine MultiByteChars bearbeiten.

cookie22 26. Aug 2013 22:57

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
AnsiChar = Char. Das ist nur Low Ascii. Alles über 128 wird als Sting interpretiert.

MeierZwoo 26. Aug 2013 23:34

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Wenn Lazerus AnsiChar als 7bitASCII interpretiert, geht aber auch #228 nur als 2-Byte Char oder string.

JamesTKirk 27. Aug 2013 08:29

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Das Problem ist nicht Lazarus, sondern wie FPC die Zeichenkodierung der Quelltextdatei handhabt. Ist eine Datei im UTF8 Format (mit oder ohne BOM), dann interpretiert FPC den Quelltext dementsprechend und dann werden auch Konstanten als UTF8 behandelt (dabei wird 'ß' zu mehr als einem Byte). Wenn du nun die Kodierung von UTF8 auf z. B. 1252 (deutsche Standardcodepage unter Windows) änderst (geht in Lazarus per Rechtsklick im Editor unter Dateieinstellungen => Zeichenkodierung) , dann kompiliert der Code wieder (du solltest deinen Algorithmus dann aber in eine eigene Unit auslagern, da sonst Zuweisungen wie
Delphi-Quellcode:
Edit1.Text := 'Groß'
wiederum für Probleme sorgen, da die LCL mit UTF8 arbeitet).
Alternativ kannst du die oben erwähnte
Delphi-Quellcode:
UTF8ToChar
-Funktion verwenden.

Ansonsten vielleicht auch mal die Artikel hier im Lazarus/FPC Wiki durchlesen.

Gruß,
Sven

Ginko 27. Aug 2013 09:34

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
Stellst du den Editor auf ansi(cp1252), kannst du die Ausgabe wie folgt machen:
Delphi-Quellcode:
uses LConvEncoding;

procedure TForm1.Button1Click(Sender: TObject);
var
  Z: Char;
begin
  Z := 'ö';
  label1.caption := CP1252ToUTF8(Z);  
end;
MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz