UTF8 und Regex

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

UTF8 und Regex

Beitrag von Scotty »

Nachdem IsWild gelöst ist, kommt das nächste Problem. Ich habe eine Regex-Funktion, die natürlich auch nicht mit Umlauten funktioniert. UTF8Decode geht zumindest unter Windows, aber wenn ich kyrillische Buchstaben auf einem ISO-8859-1 System nehme, kommt dabei natürlich auch nichts mehr raus.

Code: Alles auswählen

uses regexpr;
try
  r:=TRegExprEngine.Create(UTF8Decode(edPattern.Text));
  for i:=0 to Dictionary.Count-1 do
  begin
     x:=0; y:=0;
    if r.MatchString(UTF8Decode(Dictionary[i]), x, y) then
    begin
       sgSearchResult.RowCount:=sgSearchResult.RowCount+1;
       sgSearchResult.Cells[0,sgSearchResult.RowCount-1]:=Dictionary[i];
     end;
  end;
 finally
  r.Free;
 end;
Gibt es eine bessere Lösung, als die Enkodierung in das Wörterbuch mit aufzunehmen und dann per case zu erschlagen?

Code: Alles auswählen

case Encoding of
 'ISO_8859_1' : s:=UTF8ToSingleByte(Dictionary[i],@UnicodeToISO_8859_1)
 'CP1250': s:=UTF8ToSingleByte(Dictionary[i],@UnicodeToCP1250);
end;
if r.MatchString(s, x, y) then...
Zuletzt geändert von Scotty am Sa 4. Sep 2010, 09:36, insgesamt 2-mal geändert.

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

Re: UTF8 und Regex

Beitrag von theo »

Erst mal solltest du auf UTF8Decode verzichten, dies erzeugt einen Widestring der von TRegExprEngine.Create() gar nicht erwartet wird.
Das geht nur "zufällig" ein bisschen, weil dein System auf ISO-8859-1 eingestellt ist. Bei allen anderen Encodings und UTF-8-Linux etc. gar nicht.

Aber vielleicht kannst du die ganze Geschichte einfach in UTF-8 lassen? Das Dictionary muss dann nat. auch in UTF-8 sein.
Für Zeichenvergleiche müsste das eig. reichen.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

Das Dictionary ist UTF8. Beim Einlesen konvertiere ich per "ConvertEncoding(s, GuessEncoding(s), 'UTF-8');" und bis auf Regex läuft auch alles. Mit ^B..R$ würde man BÄR finden, aber das ist ja keine Lösung.

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

Re: UTF8 und Regex

Beitrag von theo »

Scotty hat geschrieben:Das Dictionary ist UTF8. Beim Einlesen konvertiere ich per "ConvertEncoding(s, GuessEncoding(s), 'UTF-8');" und bis auf Regex läuft auch alles. Mit ^B..R$ würde man BÄR finden, aber das ist ja keine Lösung.
Ich verstehe dein Problem nicht ganz und kenne mich auch mit RegExpr nicht gut aus, aber ich kann im Moment nicht nachvollziehen, warum es den Stringvergleich stören sollte, wenn ein 'ä' aus zwei statt einem char/byte besteht. Wenn du auf beiden Seiten das 'ä' durch 'ae' erstetzen würdest, müsste es ja auch klappen.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

Weil jemand zum Beispiel ein dreibuchstabiges Wort sucht, das mit B beginnt und R aufhört. Kein normaler Benutzer würde auf die Idee kommen, wegen der Kodierung zwei Punkte statt einem einzugeben, um auch Wörter mit Umlauten zu finden. Reguläre Ausdrücke sind halt eine schöne Möglichkeit, um komplexe Abfragen zu starten. Während der BÄR auch per UTF8IsWild gefunden werden könnte, lässt sich damit kein Ausschluss (zum Beispiel [^E] = kein E) hinbekommen.

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

Re: UTF8 und Regex

Beitrag von theo »

Ja, das versteh ich.
Dann gilt halt hier das gleiche wie bei isWild: Du müsstest das Ding unicodetauglich machen!

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

theo hat geschrieben:Du müsstest das Ding unicodetauglich machen!
Da sitze ich ja eine Ewigkeit dran :oops: ...

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

Re: UTF8 und Regex

Beitrag von theo »

Scotty hat geschrieben:
theo hat geschrieben:Du müsstest das Ding unicodetauglich machen!
Da sitze ich ja eine Ewigkeit dran :oops: ...
Dann suchste halt und findest vielleicht die da:
http://forum.lazarus.freepascal.org/ind ... l#msg48595" onclick="window.open(this.href);return false;

Sieht nach Unicode aus, evtl. per Compiler Switch.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

Die Suche klappt einwandfrei. Der Download geht allerdings nur über eine französische Seite.

71: {$DEFINE UniCode} // Unicode support <- Punkt entfernen
633: {$ifdef Windows} //kann auch komplett raus
uses
Windows; // CharUpper/Lower
{$endif}

Aufruf per:
r:=TRegExpr.Create;
r.Expression:=UTF8Decode(<Pattern>);
if r.Exec(UTF8Decode(<ItemToCompare>)) then...

Wenn ich aber die Unit schon in ein neues, leeres Projekt einbinde (ohne sie zu benutzen), kommt beim Schließen eine AV. Ich sehe keinen Grund dafür; unter initialization wird eine Funktion zugewiesen, aber kein Speicher alloziiert. Nehme ich den Unicode-Support wieder raus, kommt keine AV.

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

Re: UTF8 und Regex

Beitrag von theo »

Scotty hat geschrieben:Die Suche klappt einwandfrei. Der Download geht allerdings nur über eine französische Seite.
:roll:
Der Code ist doch hier direkt attached:
http://forum.lazarus.freepascal.org/ind ... l#msg48595" onclick="window.open(this.href);return false;
sorokin_regexpr.zip

Läuft hier übrigens einwandfrei.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

Das Attachment habe ich genommen und nach uregexpr umbenannt. Wenn ich das einbinde, kommt die AV beim Schliessen, wenn Unicode aktiviert ist (Linux und Windows). Hast du eine Idee, wo ich suchen könnte?

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

Re: UTF8 und Regex

Beitrag von theo »

Scotty hat geschrieben:Das Attachment habe ich genommen und nach uregexpr umbenannt. Wenn ich das einbinde, kommt die AV beim Schliessen, wenn Unicode aktiviert ist (Linux und Windows). Hast du eine Idee, wo ich suchen könnte?
Nö, keine Ahnung. Erstens funktioniert es hier (Linux) und zweites hat es ja keinen finalization block.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

Okay, da hab ich mich wohl heute morgen getäuscht. Unter Linux läuft es einwandfrei, nur Windows (XP-32bit und 7-64bit) muckt wie erwähnt. Ich bin ziemlich ratlos. Widestringmanager? Falsche Codepage (1252) der Pas-Datei?

Lazarus 0.9.29 r27161 FPC 2.5.1 i386-win32-win32/win64
Lazarus 0.9.29 r27161 FPC 2.5.1 x86_64-win64-win32/win64

Lazarus 0.9.29 r27067M FPC 2.5.1 x86_64-linux-gtk 2 (beta)
Zuletzt geändert von Scotty am Sa 4. Sep 2010, 20:09, insgesamt 1-mal geändert.

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

Re: UTF8 und Regex

Beitrag von theo »

K.A. was meint der Debugger / Call Stack?

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: UTF8 und Regex

Beitrag von Scotty »

Bild

Antworten