Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zusammengehörige Zeichen erkennen. (https://www.delphipraxis.net/151435-zusammengehoerige-zeichen-erkennen.html)

himitsu 18. Mai 2010 07:01


Zusammengehörige Zeichen erkennen.
 
Gibt es irgendeine Möglichkeit, um in einem MultiByte-String zu erkennen, ob 2 oder mehr Zeichen zusammenhängen.

Ich benötige dieses für eine verteilte Verarbeitung von Texten
und da müßte ich zwingend erkennen können, ob das letze Zeichen im Puffer ein Zeichen eines MultiByte-Verbundes ist und ob somit noch ein bissl Text nachgeladen werden müßte.
Ich würde mich da ungern auf Satz-, Steuerzeichen oder Wortanfänge verlassen.
(Aktuell suche ich Zeilenübergänge, aber das ist auch blöd, weil ich dann doppelt suchen müßte oder die Puffergrößen stark schwanken können, als wenn ich da blos das letzte Bytes/Zeichen prüfe und im Notfall nur noch ein paar Bytes mehr nachladen bräuchte)


Im Grunde benötige ich dieses aber in Verbindung mit Delphi-Referenz durchsuchenTEncoding, weswegen MSDN-Library durchsuchenIsDBCSLeadByteEx schon wegfallen würde, da ich irgendwie keine CodePage aus dem TEncoding auslesen kann.
Und bei UTF-8 (CP_UTF8) funktioniert IsDBCSLeadByteEx eh nicht.

[edit]
hab grad mitbekommen, daß TMBCSEncoding intern die CodePage kennt, aber irgendwer so besch***t war und diese nicht nach außen freigibt. :wall:
(nichtmal über Class-Helper oder Ableitungen kommt man da ran)

himitsu 18. Mai 2010 20:10

Re: Zusammengehörige Zeichen erkennen.
 
OK, da inzwischen auch schon jemandem mit mir via PN geschrieben hat, hier noch ein paar Überlegungen:

- es wird eine Datei oder was Anderes stückchenweise ausgelesen und verarbeitet, dabei dürfen aber natürlich zusammenhängende Strukturen nicht getrennt werden.

- da die UTF-8-Unterstüzung seitens Windows einfach nur bescheiden ist, wird das Suchen hier, selber erledigt müssen, wobei sich die Leading-/Trailing-Bytes über einen Bitvergleich recht leicht finden lassen

- die SurrogaePairs im Unicode muß ich auch selber suchen

> heißt also, daß UTF-8, UC2 und UC2-LE manuell geprüft werden

- bei den anderen CodePages, werde ich wohl versuchen über IsLeadChar und CharNextExA, bzw. CharNextW (leider gibt es auch keine Unterstützung für UC2-LE, aber die Zeit für eine Umkodierung nehm ich in Kauf, da dieses wohl selten gnutzt wird)

Wo es allerdings ein großes Problem gibt, das sind die Combining-Chars
U+0061 U+030a (LATIN SMALL LETTER A + COMBINING RING ABOVE) ergeben ja "å"


Aktuell ist mein Plan mich erstmal an den Steuerzeichen zu orientieren und möglichst da zu schneiden und wenn da keines (in einem angemessenen Bereich) zu finden ist, dann versuch ich mir noch was zu überlegen, um MultiByte-, Combining-, Surrogate-, UTF-8-, UTF-7-Zeichen und was weiß ich noch, zu erkennen und möglichst nur vor/nach diesen Zeichen zu schneiden.

Derzeit arbeitet mein Code zeilenweise, aber diese kurzen Stückchen lassen sich einfach nicht optimal verarbeiten und es bremst extrem aus.

Nja, zumindestens hab ich vorhin mal angefangen diese Verarbeitung in eine eigene Klasse auszulagen, weil es irgendwie immer mehr wird, als Anfangs mal gedacht war. :?

Namenloser 18. Mai 2010 22:01

Re: Zusammengehörige Zeichen erkennen.
 
In diesem FAQ ist ein Link auf eine Unterseite mit dem Titel Unicode Text Segmentation enthalten. Habe es mir jetzt nicht genauer angesehen, aber es klingt so recht vielversprechend für die Erkennung von Combining-Characters.

himitsu 19. Mai 2010 20:17

Re: Zusammengehörige Zeichen erkennen.
 
Das Ganze effektiv umzusetzen scheint nicht einfach zu werden. :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz