Gesuchtes Wort in Memo markieren UTF-Codierung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Namos

Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Hi alle, also ich habe es nach längeren probieren hinbekommen, ein eher leicht klingendes Problem zu lösen.
Es geht darum ein Wort das gesucht wird und gefunden wird in einem Memo Feld zu markieren. Der unten stehende Code funktioniert auch so wie ich es will. Warum geht die Umcodierung nicht automatisch ?

Code: Alles auswählen

 
begin
  if Pos(UTF8Decode(Edit1.Text), UTF8Decode(Memo1.Text)) = 0 then exit;
  Memo1.SetFocus;
  Memo1.Selstart:= Pos(UTF8Decode(Edit1.Text), UTF8Decode(Memo1.Text)) -1;
  Memo1.Sellength:= Length(UTF8Decode(Edit1.Text));
 
  Label6.Caption:= 'Pos mit UTF: ' + IntToStr(Pos(UTF8Decode(Edit1.Text),UTF8Decode(Memo1.Text)));
  Label7.Caption:= 'Pos ohne UTF: ' + IntToStr(Pos(Edit1.Text,Memo1.Text));   
end;
 

Natürlich würde das ganze schöner aussehen (und wäre natürlich effizienter) wenn man die Eingabe erst in einen String schreibt, dann braucht man sie nur einmal umcodieren. Aber ich kann mich bei Delphi nicht daran erinnern, dass man überhaupt umcodieren musste, in so einem Fall.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Socke »

Warum kodierst du denn so wild durch die Gegend? Die gesamt LCL verwendet auf allen Plattformen UTF-8. Daher enthält sowohl dein Edit-Feld mit der Eingabe als auch dein Memo-Feld UTF-8-Text. Beim Suchen ist eine Unicode-Normalisierung wesentlich sinnvoller als das umkodieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Namos

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Danke für die Antwort, wie macht man denn eine Unicode-Normalisierung ?

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

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von theo »

Du brauchst nicht alles umwandeln. Es geht auch so:


Code: Alles auswählen

uses LCLProc;
...
var poso:integer;
begin
  poso:=UTF8Pos(Edit1.text,Memo1.Text);
  if poso>0 then
  begin
   Memo1.SelStart:=poso-1;
   Memo1.SelLength:=UTF8Length(Edit1.text);
   Memo1.SetFocus;
  end;
end;   


SelStart bezieht sich tatsächlich auf die "sichtbaren Buchstaben", nicht auf die Codelänge

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Socke »

Namos hat geschrieben:Danke für die Antwort, wie macht man denn eine Unicode-Normalisierung ?

Für die meisten Anwendungen ist das vollkommen egal; von daher wird das auch nur selten durchgeführt: http://de.wikipedia.org/wiki/Normalisierung_(Unicode)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Namos

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Meine eigentliche Frage war ja warum es so nicht geht (wie in Delphi):

Code: Alles auswählen

 
var
  MemoText, SuchStr: String;
  FundPos: Integer;
begin
  MemoText:= Memo1.Text;
  SuchStr:= Edit1.Text;
  FundPos:= Pos(SuchStr, MemoText);
 
  if FundPos = 0 then exit; //Wort nicht gefunden
 
  Memo1.SetFocus;
  Memo1.Selstart:= FundPos -1;
  Memo1.Sellength:= Length(SuchStr);
end;
 

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Socke »

Namos hat geschrieben:Meine eigentliche Frage war ja warum es so nicht geht (wie in Delphi)

Dann wäre es hilfreich gewesen, wenn du auch den Quelltext aus Delphi gepostet hättest. Die Frage sollte aber zwischenzeitlich geklärt sein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Namos

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Ja fast, wenn jetzt die gesamte LCL auf allen Plattformen UTF-8 verwendet, warum wird dann der Befehl für Pos oder Length (usw.) nicht so Programmiert, dass er den UTF-8 Text aus dem Memo richtig übernimmt (anstatt das man neue Befehle wie UTF8Pos benutzen muss ) ? Ist etwas verwirrend finde ich...

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von MAC »

ich kenn die Antwort nicht genau, aber ich denke es hat mit der Kompatiblität zu tun, entweder zu Windows oder zu Delphi...

Code: Alles auswählen

Signatur := nil;

Namos

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Hi und Danke für die Antwort.
Delphi glaubig ja eher weniger sonst wäre ja der Code den ich weiter oben gepostet habe Kompatibel. Vielleicht hat es ja was mit Linux zu tun. Windows weiß ich auch nicht.
Zuletzt geändert von Namos am So 28. Apr 2013, 23:50, insgesamt 3-mal geändert.

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

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von theo »

Namos hat geschrieben:Ja fast, wenn jetzt die gesamte LCL auf allen Plattformen UTF-8 verwendet, warum wird dann der Befehl für Pos oder Length (usw.) nicht so Programmiert, dass er den UTF-8 Text aus dem Memo richtig übernimmt (anstatt das man neue Befehle wie UTF8Pos benutzen muss ) ? Ist etwas verwirrend finde ich...


Naja, das hat Vor- und Nachteile.
Den Nachteil kennst du, der Vorteil: SelStart:=SelStart+1 ist dann auch tatsächlich die nächste sichtbare Zeichenposition.

Namos

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Hallo und Danke für die Antwort.
Meinst du SelStart:=SelStart+1 oder SelStart:=SelStart-1. Ich verstehe jetzt nicht den Vorteil, der Delphi Code von mir ist doch bis auf die Umcodierung in UTF-8 genauso. Bis jetzt erkenne ich da nur Nachteile bei dem FreePascal-Code.

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: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von mschnell »

Wikipedia hat geschrieben:...
Die Normalisierung ist nötig, da es für viele Zeichen mehrere unterschiedliche Möglichkeiten gibt, diese als Kette von Unicode-Zeichen darzustellen.
...
Es gibt vier Normalformen: Zwei für kanonische Äquivalenz, zwei für kompatible, beide in je einer zerlegten Form und einer kombinierten. ...
...

Ich wusste es ja immer schon: Unicode ist von Herrn Murphy zur Bestätigung seines berühmten Satzes erfunden worden.
Vermutlich mit Unterstützung vom Herrn Freud, der seine "Fehlleistung" untermauern wollte. :evil: :evil: :evil:

-Michael
Zuletzt geändert von mschnell am Mo 29. Apr 2013, 10:57, 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: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von mschnell »

Namos hat geschrieben: Ist etwas verwirrend finde ich...

Das liegt natürlich daran, dass Lazarus im Gegensatz zu Delphi nicht nur auf Windows, sondern auch auf anderen Systemen läuft, die eine andere Unicode Codierung (8 Bit Codes statt 16 Bit Codes) verwenden. (Aber eben Unicode und nicht ANSI wie die alten Delphi- und Lazarus- Versionen. Obwohl in Lazarus die Strings "ANSISTRING" heißen, wird da UTF-8 Unicode und nicht ANSI-Code drin gespeichert. )

In der FPC Community sind momentan Arbeiten im Gange, die dynamisch codierten "New-Delphi-Strings" statt "ANSSTRING" als Standard zu verwenden (wie bei Delphi). Lazarus wird da eines Tages folgen (müssen.) Dann sollte vieles wieder "out of the Box" funktionieren und der Umstieg von (relative neuem) Delphi sollte einfacher sein. (Alte Unicode-Lazarus Programme müssen aber möglicherweise überarbeitet werden. Ebenso solche für alte (nicht Unicode-) Delphi- und Lazarus- Versionen.)

In der Übergangs-Zeit riskiert man, dass man beim Umstieg von (Unicode-) Delphi über (UTF-8-) Lazarus auf (neues-Unicode-) Lazarus seinen Sourcecode zweimal anpassen muss.

-Michael
Zuletzt geändert von mschnell am Mo 29. Apr 2013, 13:41, insgesamt 1-mal geändert.

Namos

Re: Gesuchtes Wort in Memo markieren UTF-Codierung

Beitrag von Namos »

Danke für die ausführliche Antwort. Dann heißt es wohl abwarten und Tee trinken.

Antworten