Delphi-PRAXiS

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

p80286 27. Aug 2013 11:54

AW: Dauerbrenner Umlaute: Lazarus vs. Delphi
 
[OT] vor vielen, vielen Jahren hatte ich mal Source code der so aussah:
Delphi-Quellcode:
for i:=0 to mamax do
  MyArrayÄiÖ:=i;
Mir scheint diese Zeiten sind immer noch nicht ganz vorbei.

Gruß
K-H

Phillie08 27. Aug 2013 13:25

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:
TUTF8Char
scheint mir der einfachste Weg zu sein. Damit probiere ich es mal.

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.

Ginko 27. Aug 2013 14:28

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