Erkennen ob das Zeichen ein UTF8 Zeichen ist
-
- 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
Nette Übersicht, sollte evtl. in die WissensDB aufgenommen werden.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
Nein. Darum habe ich den Text ja geschrieben. Ich hoffe er ist korrekt, Diskussion eröffnet.monta hat geschrieben: @mse: Hast du was dagegen?

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
Der Text ist fachlich sicherlich korrekt, soweit ich das beurteilen kann.mse hat geschrieben: Diskussion eröffnet.
Wer jetzt etwas zum didaktischen Aspekt sagt, muss es selber besser machen. Drum sage ich nix.

-
- 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
1) Sehr gut !mse hat geschrieben:Diskussion eröffnet.
2.) OK......



Ich meine, "String" ist nicht ausschließlich zur Speicherung von Text sinnvoll.
String ist in allen nicht uralten Implementierungen ein Type der eine variable Anzahl von Elementen enthält und reference counting verwaltet wird. Die Elemente können beliebige Bitkombinationen annehmen. Die Codierung der Elemente wenn sie als Text betrachtet ist implementierungsabhängig. Leider ist anscheinend beim neuen Delphi auch nicht mehr sichergestellt, dass es 8-Bit Elemente sind, wie FPC das demnächst macht, seht anscheinend noch in den Sternen.
Ich habe den Type "String" schon oft für andere Zwecke als Text (völlig transparent) verwendet, z.B. als Buffer variabler Länge in Kommunikationsprogrammen. Ich werde mit demnächst dafür immer einen type "Bytestring" definieren, der dann auf einen passenden Stringtyp zugeordnet werden kann.
===================
Soweit ich das in der FPC Developers' List mitbekommen habe soll es geändert werden, dass unter Windows nicht reference counted ist. (läuft das dann auf einen von Widestring unterschiedenen Typ OLEString heraus ?)
===================
Pchar und PWidechar werden von der Linux und der Windows API benutzt und sind deshalb wichtig
ANSIString (=UTF8String) und Widestring sind Inhalts-kompatibel zu pchar, so dass eine TypeUmwandling pchar(myString) keine Kopie erstellt. (deshalb wird bei ANSIString ein "überflüssiges" #0 angefügt)
===================
Es gibt auch "länderspezifiasche" ASCII - Codetabellen, die z.B. Umlaute mit Codes < 128 darstellen
-Michael
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
Nein, der neue, auf allen Systemen Referenz-gezählte widestring Typ heisst UnicodeString. Auf Linux ist UnicodeString identisch mit widestring, unter Windows nicht.mschnell hat geschrieben:Soweit ich das in der FPC Developers' List mitbekommen habe soll es geändert werden, dass unter Windows nicht reference counted ist. (läuft das dann auf einen von Widestring unterschiedenen Typ OLEString heraus ?)
MSEgui ist auf UnicodeString bereits vorbereitet:
Code: Alles auswählen
type
{$ifdef mse_unicodestring}
msestring = unicodestring;
msechar = unicodechar;
pmsechar = punicodechar;
{$else}
msestring = widestring;
msechar = widechar;
pmsechar = pwidechar;
{$endif}
-
- 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
UnicodeString ist also immer Reference counted, Widestring nur auf Linux. Also am besten Widestring nicht verwenden, wenn man nicht in Windows OLE machen will.mse hat geschrieben:Auf Linux ist UnicodeString identisch mit widestring, unter Windows nicht.
Da es bei Delhi aber nur Widestring und nicht Unicodestring gibt (oder kommt das bei D2009 dazu ?) ist es ganz schön verwirrend.

Für "professionelle" Programme also am besten _immer_ einen eigenen String-Typ deklariere und dann u.u. je nach bedarf entsprechend der Compiler-Version und der verwendeten Compiler-Optionen zuweisen

-Michaeö
-
- 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
Weiter ......
Vielleicht sollte erwähnt werden, dass UCS2 im Gegensatz zu UTF16 "Surrogates" anders behandelt. Wenn ich das richtig mitbekommen habe ist das zwar nur bei Mac wirklich relevant, aber den soll es ja tatsächlich geben, habe ich mir sagen lassen
.
================
Wenn ich das richtig sehe, ist bei allen Bytes eines UTF8-Code immer das höchste Bit gesetzt, außer er besteht nur aus einem Byte und dieses ist ein ASCII-Zeichen.
Damit wäre die einfache Antwort auf das Topic des Threads gefunden:
-Michael



Vielleicht sollte erwähnt werden, dass UCS2 im Gegensatz zu UTF16 "Surrogates" anders behandelt. Wenn ich das richtig mitbekommen habe ist das zwar nur bei Mac wirklich relevant, aber den soll es ja tatsächlich geben, habe ich mir sagen lassen

================
Wenn ich das richtig sehe, ist bei allen Bytes eines UTF8-Code immer das höchste Bit gesetzt, außer er besteht nur aus einem Byte und dieses ist ein ASCII-Zeichen.
Damit wäre die einfache Antwort auf das Topic des Threads gefunden:
Code: Alles auswählen
function is_utf8_zeiche(s: UTF8STring; index: Integer): booelan;
begin
Result := (ord(s[index]) and $80) <> 0;
end;
Zuletzt geändert von mschnell am Do 8. Jan 2009, 12:50, insgesamt 3-mal geändert.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
D2009 hat den Typ UnicodeString AFAIK, ich weiss aber nicht, ob er zu FPC UnicodeString kompatibel ist. Kann ein D2009 Besitzer dazu genaueres sagen?mschnell hat geschrieben: Da es bei Delhi aber nur Widestring und nicht Unicodestring gibt (oder kommt das bei D2009 dazu ?)
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
Ich wüsste nicht warum er es nicht sein sollte.
Das Problem ist genau das gleiche wie beim FPC UnicodeString WideString:
http://www.micro-isv.asia/2008/08/get-r ... d-unicode/" onclick="window.open(this.href);return false;
Das Problem ist genau das gleiche wie beim FPC UnicodeString WideString:
http://www.micro-isv.asia/2008/08/get-r ... d-unicode/" onclick="window.open(this.href);return false;
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
Das wird erwähnt.mschnell hat geschrieben: Vielleicht sollte erwähnt werden, dass UCS2 im Gegensatz zu UTF16 keine Surrogates kann.
Da muss ich dich korrigieren. Der erwähnte "Mac-Effekt" hat mit surrogate pairs nichts zu tun, sondern mit dem Umstand, dass unter Mac Dateinamen decomposed sind. Das heisst z.B. dass stattWenn ich das richtig mitbekommen habe ist das zwar nur bei Mac wirklich relevant, aber den soll es ja tatsächlich geben, habe ich mir sagen lassen.
ä (U+00E4 LATIN SMALL LETTER A WITH DIARESIS)
a (U+0061 LATIN SMALL LETTER A) gefolgt von ¨ (U+0308, COMBINIG DIARESIS)
geschrieben wird. Alle diese codepoints sind Bestandteil von UCS2.
-
- 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
Weiter ......
Was passiert, wenn bei der (automatischen) Umwandlung von Unicode nach ANSI, in der eingestellten System-Ansi-Tabelle das Unicode-Zeichen nicht definiert ist ?
- Michael



Was passiert, wenn bei der (automatischen) Umwandlung von Unicode nach ANSI, in der eingestellten System-Ansi-Tabelle das Unicode-Zeichen nicht definiert ist ?
- Michael
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
In D2009 gibts aber auch noch den string Typen mit gespeicherter Codierungsinformation. Hat der mit UnicodeString nichts zu tun? Da ich kein D2009 besitze kann ich der Sache leider nicht auf den Grund gehen.theo hat geschrieben:Ich wüsste nicht warum er es nicht sein sollte.
Das Problem ist genau das gleiche wie beim FPC UnicodeString WideString:
http://www.micro-isv.asia/2008/08/get-r ... d-unicode/" onclick="window.open(this.href);return false;
-
- 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
Verstehe.mse hat geschrieben:Alle diese codepoints sind Bestandteil von UCS2.
Meine Frage ist: unter welchen Umständen (außer wenn bei Mac bekloppte Dateinamen verwendet werden) wird man tatsächlich mit surrogate pairs konfrontiert werden ?
-Michael
Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist
Ich besitze auch keines.mse hat geschrieben:In D2009 gibts aber auch noch den string Typen mit gespeicherter Codierungsinformation. Hat der mit UnicodeString nichts zu tun? Da ich kein D2009 besitze kann ich der Sache leider nicht auf den Grund gehen.theo hat geschrieben:Ich wüsste nicht warum er es nicht sein sollte.
Das Problem ist genau das gleiche wie beim FPC UnicodeString WideString:
http://www.micro-isv.asia/2008/08/get-r ... d-unicode/" onclick="window.open(this.href);return false;
Das hier sind interessante Info-Quellen:
http://dn.codegear.com/article/38437" onclick="window.open(this.href);return false;
http://dn.codegear.com/article/38498" onclick="window.open(this.href);return false;
Ich könnte aber damit die Frage auch nicht abschliessend beantworten.
"A UnicodeString can contain either a Unicode-sized character, or an ANSI byte-sized character. "