utf8 und Umlaute, Sonderzeichen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

utf8 und Umlaute, Sonderzeichen

Beitrag von guennid »

Wie handelt man in einem free pascal Programm und utf8 deutsche Umlaute und andere Sonderzeichen?

Code: Alles auswählen

VAR
 einB : CHAR;
 einWC : WIDECHAR;
 einS : STRING;
... 
 einS := 'Ärgerlich';write(einS); {schreibt "Ärgerlich"}
                     write(copy(einS,1,1)); {gibt "nichts" aus}
                     write(copy(einS,3,1)); {schreibt das "r"}
...

woraus wir messerscharf schließen, dass das "Ä" in den beiden ersten Zeichen stecken muss.
und richtig:

Code: Alles auswählen

write(copy(einS,1,2)) schreibt das "Ä"}

einB := 'Ä' bringt genauso wie einWC := 'Ä' den Kompilierfehler:

Code: Alles auswählen

Incompatible types: got "Constant String" expected "Char"
(nur so am Rande, der TYP "Constant String" ist hier unbekannt. Ich vermute auch, dass es den gar nicht gibt. Und ich weiß auch nicht, was ich mir unter einem "konstanten" String vorstellen soll.)
Woraus ich wieder messerscharf schließe: Das 'Ä' ist hier gar kein Zeichen, sondern ein String.
Heißt das jetzt, dass man die Umlaute in der genannten Umgebung per Definition prinzipiell nicht mehr als Zeichen behandeln kann?
Aber wie überprüfe ich dann in einem unbekannten String das Vorkommen von Umlauten/Sonderzeichen? Ein

Code: Alles auswählen

IF einS[i] = [was auch immer]
wird dann ja nicht mehr gehen.

Grüße, Günther

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von monta »

Das ist das Problem, was bereits im anderen Thread angesprochen wurde. UTF ist über den ersten 128 Zeichen mit mehr als einem Byte kodiert. Ein normales Char hat aber nur ein Byte, also passen Zeichen über dem 128. auch nicht in ein normales Char, da sie mit mindestens zwei Byte kodiert sind. Genauso beim String, der mit einem Byte pro Zeichen arbeitet, daher liefert ja auch der Zugriff auf das dritte Zeichen das 'optisch' zweite, weil ein Ä halt zwei Zeichen belegt.

Du kommst nicht drum rum, dich mit UTF8 und mit WideStrings und WideChars zu beschäftigen, dann gaht auch der vergleich, bspw. so:

Code: Alles auswählen

var
  einWC : WIDECHAR;
  einS : WIDESTRING;
begin
  einS := UTF8Decode('Ärgerlich');
  ShowMessage(UTF8Encode(einS)); {schreibt "Ärgerlich"}
  ShowMessage(UTF8Encode(copy(einS,1,1))); {gibt "Ä" aus}
  ShowMessage(copy(einS,3,1)); {schreibt das "g"}
 
  einWC := UTF8Decode('Ä')[1];
 
  if  einWC = copy(einS,1,1) then
    ShowMessage('Identisch');     //wird angezeigt
Falls noch nicht gelesen, auch wichtig:
http://wiki.lazarus.freepascal.org/LCL_Unicode_Support" onclick="window.open(this.href);return false;
Johannes

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von guennid »

Na, das ist doch mal 'ne Hilfe! Danke!
monta hat geschrieben:Du kommst nicht drum rum, dich mit UTF8 und mit WideStrings und WideChars zu beschäftigen
Ich weiß, dass ich dazulernen muss. Ich müsste aber auch wissen, wo und es müsste Deutsch sein und statt von missionarischem Eifer sollte es von weiterführenden Beispielen geprägt sein. :wink: - Zu anspruchsvoll :?:

"ShowMessage" ist Delphi/Lazarus nehm' ich mal an? Wenn doch pascal, welche unit?

Grüße, Günther

[edit:] Mann, das war saugut :!: :!: :!: :!: :!: :!:

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von monta »

guennid hat geschrieben:"ShowMessage" ist Delphi/Lazarus nehm' ich mal an? Wenn doch pascal, welche unit?
Ach ja, hab nicht dran gedacht, das du ja nur Konsole hattest.
Ist aus der Unit Dialogs von der LCL, also Lazarusspezifisch (bzw. eben Delphi) mit GUI.
Johannes

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von guennid »

Ach ja, hab nicht dran gedacht, das du ja nur Konsole hattest.
Kein Problem, brauchte ich nur durch write() zu ersetzen. Nochmal, Ich glaube, da hast du mich ein gutes Stück weitergebracht!!!

muss ich CASE in diesen Zusammenhängen vergessen? Wenn nicht und du hättest nochmal so'n schönes Beispiel, müsst ich dich knutschen :lol:

Grüße, Günther

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von monta »

darauf muss ich leider verzichten :lol:

Mir fällt gerade auch nicht ein, was mit Case läuft, die frage wäre aber interessant.
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von Christian »

Montas beispiel ist etwas unglücklich.
Dabei wird aus Unicode ansi gemacht und damit werden alle unicode Zeichen rausgeschmissen.
Wenn dein programm plötzlich mal in Ländern einegsetzt werden soll wü Unicode nötig ist (Fernost o.ä.), ist das nicht möglich.
Besser ists nicht string sondern widestring zu nehemen fpc entscheidet dann selbst das es ein unicodetaugliches copy zu evrwenden hat und alles ist unicodetauglich mit demselben code ohne utf8 en und decode...
Dei sollte man nur verwenden wenns wirklich an Schnittstellen geht die nicht unicodetauglich sind.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

Christian hat geschrieben: Dabei wird aus Unicode ansi gemacht und damit werden alle unicode Zeichen rausgeschmissen.
Wie kommst du denn da drauf?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von mschnell »

guennid hat geschrieben:
Ach ja, hab nicht dran gedacht, das du ja nur Konsole hattest.
muss ich CASE in diesen Zusammenhängen vergessen?
Befürchstest Du, auf eine WideChar variable wäre kein "case" möglich. Das sollte mich sehr wundern. Wie man aber bequem WideChar Konstanten für die Vergleichswerte generiert, weiß ich nicht.

das jedenfalls geht in Turbo-Delphi und sicher auch in der Unicode-fähigen FP-Version:

Code: Alles auswählen

var 
  w: Widechar;
  c: char;
 
...
 
  case w of
    'a': c:=''1';
    #$c255: c := '2'; 
  end;
Wo wird geknutscht ? :) :) :)

-Michael

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von RSE »

Die Frage ist ja eher, wie Multibyte-Zeichen in case zu realisieren sind ;-)
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

RSE hat geschrieben:Die Frage ist ja eher, wie Multibyte-Zeichen in case zu realisieren sind ;-)
Der Logik folgend für einen IDE-Editor der im UTF8-Modus läuft würde ich mal sagen so:

Code: Alles auswählen

case w of
UTF8Decode('ä')[1] : ...
(Ungetestet)

EDIT: Nö, geht nicht, weil das keine Konstante ist. Dann wohl nur über das "Word" $00E4
Zuletzt geändert von theo am Mo 22. Sep 2008, 11:34, insgesamt 1-mal geändert.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von mschnell »

RSE hat geschrieben:Die Frage ist ja eher, wie Multibyte-Zeichen in case zu realisieren sind ;-)
WideChar ist doch ein Multibyte-Zeichen ?!?!?!?

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von Christian »

Wie kommst du denn da drauf?
Sorry hatte UTF8Decode falsch interpretiert.
theo hat geschrieben:

Code: Alles auswählen

case w of
UTF8Decode('ä')[1] : ...
(Ungetestet)
geht sicher nicht da w ein char ist und utf8decode einen string zurückgibt. Case ist meines wissens auch nicht multibyte oder stringfähig
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von RSE »

Sorry, #$c255 sind ja 2 Byte...
Christian hat geschrieben:Case ist meines wissens auch nicht multibyte oder stringfähig
Multibyte ja, denn Int64 geht ja auch (8 Byte lang), String nicht, da String kein Ordinaltyp ist. Die Einschränkung lautet, dass nur Ordinaltypen verarbeitet werden können (also Integer, Char etc., aber eben keine zusammengesetzten Datentypen wie String).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

Christian hat geschrieben:
geht sicher nicht da w ein char ist und utf8decode einen string zurückgibt.
Falsch, das ginge schon, da
UTF8Decode('ä')[1]
der Erste WideChar eines WideString ist.

Geht aber aus anderem Grund nicht, weil case eine Konstante erwartet.
Christian hat geschrieben: Case ist meines wissens auch nicht multibyte oder stringfähig
Falsch, ein WideChar ist letztlich ein Word und also schon zu casen.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var wc:WideChar;
begin
  wc:=UTF8Decode('Ω')[1];
  case wc of #$03A9 :ShowMessage('yes');
  end;
end;

Antworten