Erkennen ob das Zeichen ein UTF8 Zeichen ist

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von pluto »

Ich hatte das schonmal so:

Code: Alles auswählen

WordDelimiters2 = ['(',')','[',']','{','}','=','.',':','?',' ','-'];
Das gleiche resultat.

Es gibt ein UTTF8Char meines wissen. Dein Vorschlag ist aber trotzdem nicht schlecht "mschnell"
Mal sehen.... Aber ist soviel Aufwand wirklich notwendig für so ein "kleines" Problem ?
MFG
Michael Springwald

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

Mach's nicht komplizierter als nötig.
mschnell hat geschrieben: Meiner Ansicht nach keine gute idee ! Was passiert, wenn einer dieser Character als zweites Byte in einem Codepoint eines UTF8-kodierten Zeichens vorkommt ?
Kommt afaik per UTF-8 Definition nicht vor.
mschnell hat geschrieben: Was ist, wenn man einen Codepoint als delimiter verwenden will, der sich nicht als ein Byte darstellen lässt
Will Pluto nicht.

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: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von mschnell »

theo hat geschrieben:Hast du irgendwelche Anhaltspunkte, was denn konkret in der Pipeline ist?
Bevor ich mir wieder die Finger verbrenne: Schaue Dir das Backlog der FPC Developers Mailing List an !
Ich denke, Delphi 2009-Kompatibilität ist auf jeden Fall in der Pipeline (Da gibt es einen völlig neuartigen String Typ, der seine interne Kodierung bei der Zuweisung bekommt und sie somit kennt. Bei String-Operationen wird diese Kodierung automatisch verwendet und bei Bedarf wird entsprechend umkodiert.
Weil die Automatik aber natürlich die Performance verschlechtert, ist bei FPC wohl auch eine statische Lösung (vermutlich - wie u. a. von mir vorgeschlagen - mit Compiler-interner Unterscheidung der Typen UTF8String und ANSIString) in Arbeit.

-Michael

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: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von mschnell »

theo hat geschrieben:Mach's nicht komplizierter als nötig.Kommt afaik per UTF-8 Definition nicht vor.
Da hast Du vermutlich recht. Die "weiteren Bytes" bei UTF8 scheinen alle das oberste Bit gesetzt zu haben.
Wirklich schön, wie intuitiv die Unicode Stringverarbeitung mit UTF8 ist. :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil:
Mit Widestring wäre es unproblematisch, aber Widestring / WideChar in Lazarus hat wiederum andere Tücken (man kann z.B. ohne manuelle umkodierung keine Konstanten auf einen Widetring zuordnen).
(@Christian: Aber wenn man keinen Typ Char benutzt geht's mit UTF8 natürlich ohne genaue Unicode-Kenntnisse, wenn auch mit schlechter Performance.)

-Michael
Zuletzt geändert von mschnell am Di 6. Jan 2009, 17:13, insgesamt 3-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von pluto »

Mein Problem bzw. Frage habt ihr aber verstanden oder ?
MFG
Michael Springwald

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: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von mschnell »

pluto hat geschrieben:Mein Problem bzw. Frage habt ihr aber verstanden oder ?
Solange Du meinst, es gibt einen UTF8Char, ist sie auch nicht zu verstehen :(.
Versuche erst 'mal im ganzen Projekt ausschließlich denselben String Typ zu verwenden !

Type PlutoString = WideString;
oder
Type PlutoString = UTF8String;

Mischen verschiedener Stringtypen ist mangels Konvertierungs-Automatik nicht so einfach.

-Michael
Zuletzt geändert von mschnell am Di 6. Jan 2009, 17:22, insgesamt 2-mal geändert.

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

pluto hat geschrieben:Mein Problem bzw. Frage habt ihr aber verstanden oder ?
Ja schon, ich meine aber, dass es mit deinen WordDelimiters2 klappen müsste.
Ich weiss aber natürlich nicht, was dein str:=Lines[CaretY]; z.B. zurückgibt. UTF-8 oder WideString UCS-2 ?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von pluto »

Müsste man das erkenne ? und entsprechen Reagieren ? Wie "mschnell" Vorgeschlagen hat mit einem PlutoString. Aber die Frage währe dann, wenn das wirklich das Problem ist das ich die Falschen Datentypen verwende, wie würde das an einem Beispiel aussehen mit PlutoString ?
MFG
Michael Springwald

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

pluto hat geschrieben:Müsste man das erkenne ? und entsprechen Reagieren ? Wie "mschnell" Vorgeschlagen hat mit einem PlutoString. Aber die Frage währe dann, wenn das wirklich das Problem ist das ich die Falschen Datentypen verwende, wie würde das an einem Beispiel aussehen mit PlutoString ?
Du musst einfach einheitlich entweder UTF8 oder UCS-2 (WideString) verwenden, sonst gibt's ein Durcheinander.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von pluto »

Das hast du schon öfter gesagt, ich verwende im ganzen code eigentlich NUR WIDESTRING. Ist das Falsch ? währe UTF8String besser ?
Ich weiß nicht was vorliegt. Es kann alles sein.
MFG
Michael Springwald

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

pluto hat geschrieben:Das hast du schon öfter gesagt, ich verwende im ganzen code eigentlich NUR WIDESTRING. Ist das Falsch ? währe UTF8String besser ?
Ich weiß nicht was vorliegt. Es kann alles sein.
WideString allein macht noch kein UCS2.

Die LCL verwendet ja überall UTF-8, du musst wenn du WideString verwenden willst also alles was du von der LCL kriegst oder and die LCL schickst umwandeln.
Also UTF8Keypress, TextOut etc... mit UTF8Decode oder UTF8Encode bearbeiten.
Dann kannst du intern mit UCS-2 arbeiten.
Wenn du die Umwandlung nicht machst, ist alles UTF-8. Geht auch, kommt aber auf deine Funktionen an, ob diese das unterstützen.

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: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von mschnell »

pluto hat geschrieben:ich verwende im ganzen code eigentlich NUR WIDESTRING.
"Eigentlich" ist ganz schlecht !!! In Deinem Code steht "s:string;" Und String ist (momentan) identisch mit ANSIString und das wiederum ist (idiotischer Weise) identisch mit UTF8String.

Widestring ist nicht schlecht sondern in vieler Hinsicht viel einfacher zu handeln als UTF8. Braucht aber doppelt so viel Speicher. Außerdem funktioniert beim aktuellen Lazarus die Zuweisung "MyWideString := 'ich bin schön'; nicht korrekt. (Siehe diverse andere Threads hier. Du musst statt dessen idiotischerweise "MyWideString := UTF8Decode('ich bin schön'); schreiben).

Am besten machst Du dann auch noch eine Unit mit jede Menge "Wrapper" Funktionen um die LCL-API von UTF-8 auf Widestring zu trimmen.

-Michael

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

mschnell hat geschrieben:
theo hat geschrieben:Hast du irgendwelche Anhaltspunkte, was denn konkret in der Pipeline ist?
Bevor ich mir wieder die Finger verbrenne: Schaue Dir das Backlog der FPC Developers Mailing List an !
Wie gesagt, finde ich da keinen konkreten Plan, von einer Roadmap ganz zu schweigen.

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von Socke »

pluto hat geschrieben:Werde weitere Test zu gegebener Zeit durchführen. Ich verstehe gar nicht warum das so kompliziert ist. Es müsste doch voll kommen reichen wenn ich in meinem code statt string widetstring nutzte. wenn ich jetzt auf ein Char zurückgreifen möchte müsste es doch ein UTF8Char sein. Aber genau das ist anscheint nicht der Fall. Ich sehe das als BUG in Lazarus. Dazu wird es auch noch viele fragen geben. Ganz verstanden habe ich es auch noch nicht. Ich nutzte in dem Projekt nur Widestring. Einheitlich. Da einige Test ergeben haben das ich damit auch mit Umlaute Arbeiten kann.
Das Problem ist, dass ein Widestring die Codierung UCS2 (wenn ich mich nicht irre) verwendet. Damit können so ziemlich alle lebende Sprachen kodiert in 2Byte werden. Zwar gibt es die irgendwo mal angesprochene Surrogate-Technik um mehr Zeichen (d.h. alle Unicode Zeichen) zu kodieren, aber ich bezweifle, dass dies von dem FPC/der LCL irgendwo genutzt wird.
Der Quelltext wird standardmäßig in UTF-8 kodiert. Somit sind auch alle Strings UTF8Strings (es gibt je technisch gesehen keinen Unterschied zwischen AnsiString und UTF8String). Wenn du also einen Quelltextzeichen/-string in einen WideChar/-string packen willst, musst du function UTF8Decode(const s : UTF8String): WideString; verwenden. Der Buchstabe 'ä' belegt immer 2Byte - sowohl in UTF-8 (als Multibyte-Zeichen) als auch in UCS-2 (ein WideChar).
Vergleiche müssen also immer mit dieser Funktion oder korrekt kodierten Variablen durchgeführt werden. Die Ausgabe eines Widestrings setzt aber auch eine LCL mit WideString-Unterstützung voraus. D.h. unter Win32 (bei mir noch ohne) wird ein WideString nicht wirklich richtig angezeigt. Zwar kann man einen UTF8String ohne Compilermeldung in einen WideString speichern, aber dann ist dieser einfach falsch kodiert und enthält nach der UCS-2-Kodierung falsche Zeichen.

MfG Socke
P.S. Eine Programmierumgebung mit unterschiedlichem Unicode-Support (FCL und LCL sind da unterschiedliche) verhindern das eindeutige Behandeln von Strings; Einsteiger sollte/muss man darauf Hinweisen, dass das, was man in der IDE eingibt, ein UTF8 kodierter String ist und in einer AnsiString-Variablen gespeichert wird; und dass man dann trotzdem nicht immer mit s ein vollständiges Zeichen erhält. Ein Typ für UTF-8 Buchstaben wäre zwingend ein ganzer String (und das muss man wissen).
P.P.S. Warum benutzt mein Lazarus (0.9.26) unter WinXP immer noch CP1252 als Kodierung (mir ist klar, dass ich das umstellen kann/muss, und ich tue dies auch)?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von pluto »

Zum Festhalten:
Ich muss Praktisch bevor ich auf eine Variable zugreife ersteinmal ein UTF8Decode durchführen um sicherzugehen das es sich um ein UTF8String handelt. Richtig ?
MFG
Michael Springwald

Antworten