Prüfen ob Char Grad-Zeichen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Prüfen ob Char Grad-Zeichen

Beitrag von Nils »

Hi,

ich mach mal wieder gerade ein Windows-Programm für Linux klar. Dabei gibt es ein Problem: Wie prüft man, ob ein Char ein Grad-Zeichen ist ? Mit Delphi kein Problem, es scheint mit Unicode zusammenzuhängen.

Code: Alles auswählen

if s[i] in ['^', '!', '°'] then

Code: Alles auswählen

Error: Ordinal expression expected
Der Fehler tritt beim '°' auf. Schreibe ich einfach

Code: Alles auswählen

if (s[i] in ['^', '!']) or (s[i] = '°') then
wird der Code zwar kompiliert, aber das Grad-Zeichen wird offensichtlich nicht erkannt.
Zuletzt geändert von Nils am Fr 6. Feb 2009, 21:51, insgesamt 1-mal geändert.
Meine Musik: spiker-music.net

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

Ja, weil das Grad-Zeichen bereits ein String ist in UTF8.

Wie man es löst hängt ein bisschen mit der Aufgabe zusammen.
Du kannst vorher den UTF8-String in WideString umwandeln und damit arbeiten.
Oder auch den UTF8Helper verwenden: http://www.lazarusforum.de/viewtopic.php?p=24321#p24321" onclick="window.open(this.href);return false;

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: Prüfen ob Char Grad-Zeichen

Beitrag von mschnell »

Bei der aktuellen Unicode-fähigen Lazarus-Version sollte man s und den Char-Type (auch implizit z.B in "case" oder set von Char) nicht verwenden, außer man überlegt sich genau, was bei UTF-8 codierten Strings da passiert. Du musst mit string "copy" und "if string1=string2" Kaskaden statt case darum 'rum programmieren. Da wird Theos Unit helfen.

WideString statt (ANSI- oder UTF8-)String verwenden geht prinzipiell auch (wenn Du einzel-chars und "case" verwenden willst), es ist in Lazarus aber nicht trivial einem Widestring oder WideChar eine Konstante zuzuweisen. MSE-GUI macht es da einfacher. Eine zukünftige FreePascal-Version, wird vermutlich auch ein neues Lazarus ermöglichen, das hier (vermutlich ähnlich wie Delphi 2009) anders (möglicherweise einfacher zu handhaben) arbeitet.

-Michael

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

mschnell hat geschrieben: Du musst mit string "copy" und "if string1=string2" Kaskaden statt case darum 'rum programmieren.
Bin an einer Lösung dran. Dauert aber noch ein bisschen.
Wird im Gebrauch etwa so aussehen:

Code: Alles auswählen

S:='abäcd';
US:=TUTF8Scanner.Create(S);
US.FindChars:='abcäöü';
Repeat
  AChar:=US.Next;
  Case US.FindIndex(AChar) of
    0: writeln('ein a');
    1: writeln('ein b');
  End;    
Until US.Done;

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

So, jetzt is es aber nicht mehr schwierig ;-)
Es gibt eine neue Klasse TUTF8Scanner

Beispiel:

Code: Alles auswählen

US:=TUTF8Scanner.Create(S);
US.FindChars:='äö'; //Einfach alle Buchstaben die man suchen will aneinander reihen. Statt ['ä', 'ö']
repeat
 case US.FindIndex(US.Next) of
  {ä} 0: begin US.Replace('A'); end;
  {ö} 1: begin US.Replace('O'); end;
 end;
until US.Done;
Memo1.text:=US.UTF8String;
US.free;
Kommentierte Case Statements kann man sich erzeugen lassen.
Einfach die Findchars setzen und dann

Code: Alles auswählen

Memo1.Text:=US.GenerateCaseStatement(true,'US');
Den Text kann man sich nun in den Code kopieren.

Viel Spass!
Dateianhänge
utf8scanner.pas
Verbesserte Version
(7.75 KiB) 73-mal heruntergeladen
utf8helper.pas
Kleine Verbesserungen.
(12.85 KiB) 78-mal heruntergeladen
Zuletzt geändert von theo am Di 10. Feb 2009, 00:35, insgesamt 7-mal geändert.

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: Prüfen ob Char Grad-Zeichen

Beitrag von Christian »

Warum reicht ein

Code: Alles auswählen

while tmp <> '' do
  begin
     if copy(tmp,0,1) = '°' then break;
     tmp := copy(tmp,2,length(tmp));
  end;
nicht aus ? Muss man doch keine extra klassen drum rumbasteln.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

Christian hat geschrieben: Muss man doch keine extra klassen drum rumbasteln.
Dein Vorschlag wird nicht funzen.
Das Zeichen da ist bereits im zweibytigen UTF-8 Bereich.
Ausserdem ersetzt dein Ansatz das Set of Char nicht gerade handlich.

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: Prüfen ob Char Grad-Zeichen

Beitrag von Christian »

Copy kopiert byteweise und nicht zeichenweise ?
Dann nehme man einfach UTF8Copy ??
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

Super effizient ;-)
Und wie willst du das casen?

Überleg dir die Geschichte mal zu Ende, und dann überlegst du nochmal, was an meiner Lösung nicht gut ist.

Wenn du eine gescheite Antwort hast, nehme ich die gerne entgegen.
Ansonsten gilt dein Motto: W.M.k.A.h.e.m.F.h.

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: Prüfen ob Char Grad-Zeichen

Beitrag von mschnell »

theo hat geschrieben:So, jetzt is es aber nicht mehr schwierig ;-)
Klasse !

Ich verstehe eigentlich nicht, warum nicht 'mal jemand den FPC auf "case of string" erweitert hat. Das im Compiler auf if-Kaskaden umzusetzen sollte doch nicht allzu schwierig sein. (Aber: http://z505.com/cgi-bin/qkcont/qkcont.c ... %20Ability" onclick="window.open(this.href);return false; )

Momentan , wo bei Strings vermutlich noch tiefgreifende Änderungen anstehen, sollte man so ein Ansinnen natürlich erstmal zurückstellen !

-Michael

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

mschnell hat geschrieben:Klasse !
Danke
mschnell hat geschrieben: Ich verstehe eigentlich nicht, warum nicht 'mal jemand den FPC auf "case of string" erweitert hat. Das im Compiler auf if-Kaskaden umzusetzen sollte doch nicht allzu schwierig sein. (Aber: http://z505.com/cgi-bin/qkcont/qkcont.c ... %20Ability" onclick="window.open(this.href);return false; )
Der Ansatz da ist ähnlich wie meiner, nur dass ich keine Array of String sondern eine TList halte. Die USC4Char werden einfach auf Pointer gecastet. Sollte ausreichend schnell sein.
mschnell hat geschrieben: Momentan , wo bei Strings vermutlich noch tiefgreifende Änderungen anstehen, sollte man so ein Ansinnen natürlich erstmal zurückstellen !
In vielen Bereichen hat das Set of Char bei Unicode sowieso ausgedient.
Will man z.B. für alle Sprachen Satzzeichen von Buchstaben trennen, kommt man damit nicht mehr weit. Da braucht es Tabellen.
Bis das Ganze in der FCL implementiert ist, kann man dazu meinen UTF8proc Port verwenden.
http://www.lazarusforum.de/viewtopic.php?p=26646#p26646" onclick="window.open(this.href);return false;

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Re: Prüfen ob Char Grad-Zeichen

Beitrag von _Bernd »

Gehört jetzt nicht zur eigentlichen Diskussion, aber
müßte es nicht eigentlich W.m.k.A.h.e.m.F.h. heißen? ;-)

Gruß, Bernd.

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

_Bernd hat geschrieben:müßte es nicht eigentlich W.m.k.A.h.e.m.F.h. heißen? ;-)
Kann sein, hab's einfach aus Christians Sig. kopiert. ;-)

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: Prüfen ob Char Grad-Zeichen

Beitrag von Christian »

ich wollte lediglich nicht mit kanonen auf Spatzen schiessen, von casen war nie die rede. 2 If anweisungen tuns auch.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: Prüfen ob Char Grad-Zeichen

Beitrag von theo »

Christian hat geschrieben:ich wollte lediglich nicht mit kanonen auf Spatzen schiessen
Du wolltest einfach rummotzen. So gut kenne ich dich schon. ;-)

Übrigens: Deine Signatur hat einen CharCase Fehler, sagt _Bernd.

Antworten