Copy() von Buchstabe 'ä' ?

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Copy() von Buchstabe 'ä' ?

Beitrag von MmVisual »

Hallo,
Ich habe ein Memo, darin tippe ich was. Dann möchte ich jeden Buchstabe einzeln auslesen:

Code: Alles auswählen

For i := memTest.Lines.Count - 1 DownTo 0 Do // Alle Zeilen ausgeben
  Begin
    //s := Utf8ToAnsi(memTest.Lines[i]); // Test
    //s := UTF8Encode(memTest.Lines[i]); // Test
    //s := UTF8Decode(memTest.Lines[i]); // Test
    s := memTest.Lines[i]; // Test
    While Length(s) > 0 Do // jedes Zeichen einzeln rechnen
    Begin
      s2 := Copy(s, 1, 1);
      Delete(s, 1, 1);
      Irgend_Ein.Canvas.TextOut(x,y,s2);
: : :
Immer wenn im Text ein Umlaut, z.B. "ä" "ö" "ß" drin steht, dann macht die Copy-Zeile ein "?" in s2. Das Delete löscht auch nicht das "ä"-Zeichen. Irgendwie arbeitet das nicht mit UTF-8 Codierung zusammen sondern Byteweise.

Ich habe auch schon die Suche belästigt und in StrUtils auch nichts passendes gefunden.

Gibt es sowas wie UTF8Copy() und UTF8Delete() ?

Im Prinzip müsste ich einfach erkennen ob das Zeichen ein einzel-Byte oder ein Doppelbyte ist und dann entsprechend Copy(s, 1, 1 / 2) machen. Aber wie kann ich das erkennen?

Vielen Dank für eure Hilfe, Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

Re: Copy() von Buchstabe 'ä' ?

Beitrag von theo »

MmVisual hat geschrieben: Gibt es sowas wie UTF8Copy() und UTF8Delete() ?
Alles genau so in unit LCLProc.

Das ist übrigens sehr aufwändig (performance) wie du das machst mit Delete.
Der UTF8Scanner wäre hier effizienter: http://wiki.lazarus.freepascal.org/Theodp" onclick="window.open(this.href);return false;

Code: Alles auswählen

s := TUTF8Scanner.Create(memTest.Lines[i]);
For i := 1 to s.Length do //tuwas mit s[i]
s.free;

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Copy() von Buchstabe 'ä' ?

Beitrag von MmVisual »

Das sieht ja einfach aus!
Leider kann ich das ZIP heute Abend nicht von Deiner Seite laden. Ich versuche es morgen nochmal.

Vielen Dank schonmal!
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Copy() von Buchstabe 'ä' ?

Beitrag von MmVisual »

Ja, Super, es geht !!! :D Vielen Dank.
Es braucht natürlich die Unit utf8scanner von dem Link. LCLProc wird nicht extra benötigt.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

Re: Copy() von Buchstabe 'ä' ?

Beitrag von theo »

MmVisual hat geschrieben: Es braucht natürlich die Unit utf8scanner von dem Link. LCLProc wird nicht extra benötigt.
Für den UTF8scanner brauchst du keine extra LCLProc, das war für UTF8Copy() und UTF8Delete() gemeint.

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Copy() von Buchstabe 'ä' ?

Beitrag von felix96 »

Code: Alles auswählen

var i: integer;
//...
for i:=0 to length(string1) do string2:=string2+string1[i];
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Copy() von Buchstabe 'ä' ?

Beitrag von MmVisual »

Damit gibt es kein Problem. Zwar wird durch das Einzel-Byte kopieren das 2-Byte UTF8 Zeichen auseinander genommen, aber wegen der FOR Schleife, dem nächsten Durchlauf wieder zusammen gesetzt.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten