![]() |
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:
In Delphi funktioniert das, Lazarus meldet folgenden Fehler:
procedure test;
var Z: char; begin Z := 'a'; Z := 'ß'; //Hier wird Fehler gefunden, ebenso nächste Zeile Z := 'ö'; end;
Code:
Offenbar wird 'ä' usw. nicht als Zeichen, sondern als Zeichenkette interpretiert.
unit1.pas(48,8) Error: Incompatible types: got "Constant String" expected "Char"
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. |
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; |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Im Lazarus-Forum habe ich die Funktion UTFToChr gefunden. Vielleicht hilft dir die:
Delphi-Quellcode:
Zumindest kompiliert Lazarus so den Code.
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; |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Da kannst du die Chars dann gleich mit dem Ascii Code aufrufen. Im Falle von ß dann #225;
|
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Hi !
Delphi-Quellcode:
wäre auch ne Möglichkeit.
uses LCLType;
procedure test; var Z: TUTF8Char; begin Z := 'a'; Z := 'ß'; Z := 'ö'; end; MfG |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Kennt Lazerus keine AnsiChar? Denn Du willst ja AnsiChar (1 Byte Chars) und keine MultiByteChars bearbeiten.
|
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
AnsiChar = Char. Das ist nur Low Ascii. Alles über 128 wird als Sting interpretiert.
|
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Wenn Lazerus AnsiChar als 7bitASCII interpretiert, geht aber auch #228 nur als 2-Byte Char oder string.
|
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:
wiederum für Probleme sorgen, da die LCL mit UTF8 arbeitet).
Edit1.Text := 'Groß'
Alternativ kannst du die oben erwähnte
Delphi-Quellcode:
-Funktion verwenden.
UTF8ToChar
Ansonsten vielleicht auch mal die Artikel ![]() Gruß, Sven |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Stellst du den Editor auf ansi(cp1252), kannst du die Ausgabe wie folgt machen:
Delphi-Quellcode:
MfG
uses LConvEncoding;
procedure TForm1.Button1Click(Sender: TObject); var Z: Char; begin Z := 'ö'; label1.caption := CP1252ToUTF8(Z); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz