![]() |
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; |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
[OT] vor vielen, vielen Jahren hatte ich mal Source code der so aussah:
Delphi-Quellcode:
Mir scheint diese Zeiten sind immer noch nicht ganz vorbei.
for i:=0 to mamax do
MyArrayÄiÖ:=i; Gruß K-H |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
Ich möchte mich bei allen Hilfsbereiten bedanken, ich komme jetzt in der Tat weiter, zumindest Compiler-technisch.
Der Hinweis auf
Delphi-Quellcode:
scheint mir der einfachste Weg zu sein. Damit probiere ich es mal.
TUTF8Char
Nur, falls es interessiert: Ich hatte natürlich die Tatsache im Auge gehabt, dass die nationalen Sonderzeichen im oberen Teil der Codetabelle liegen und daher mit Sachen wie WideChar, AnsiChar usw. experimentiert, alles ohne Erfolg. |
AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
TUTF8Char ist ja nichts anderes als ein String der auf die Länge 7 beschränkt ist. Was der jetzt genau für einen Vorteil gegenüber dem normalen String in Lazarus hat, konnte ich nicht rausfinden.
Wenn du es wirklich so haben willst wie in Delphi, ist es denke ich am besten die Zeichenkodierung so umzustellen, wie JamesTKirk es beschrieben hat. Die Vorgehensweise für die Ausgabe hatte ich ja unten drunter beschrieben. Ansonsten kannst du statt TUTF8Char auch String benutzen, dann sparst du auch noch die LCLType. MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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