Erkennen ob das Zeichen ein UTF8 Zeichen ist

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
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: mystring:='ä'; kommt doch in der Praxis kaum vor
Geht auch in .NET, Java etc nicht (lässt sich nicht übersetzen, weil Strings nicht veränderbare Einheiten sind). Aber der FPC-Compiler macht noch nicht 'mal eine Fehlermeldung, sondern tut etwas, was völlig unerwartet ist, wenn man sich nicht im Detail mit Unicode auseinandergesetzt hat.

Aber c := mystring kommt in der Praxis durchaus häufig vor und geht in anderen Sprachen auch, und funktioniert mit Widestrings "fast immer" "wie erwartet". Nur in Lazarus funktioniert es eben "fast nie" "wie erwartet".

-Michael

Benutzeravatar
theo
Beiträge: 10927
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: mystring:='ä'; kommt doch in der Praxis kaum vor
Aber der FPC-Compiler macht noch nicht 'mal eine Fehlermeldung,


In diesem Falle macht er schon eine Fehlermeldung.
Error: Incompatible types: got "Constant String" expected "Char"

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von Christian »

@af du willst es nicht verstehen oder ?
Wie Theo schon sagte ist dieser Fall das man auf einzelne zeichn zugreift ziemlich Praxisfern, ich hab das in meinen massen an Code ziemlich selen vorkommen und hatte somit auch kaum Probleme mit der Unicodeumstellung. Das wurde dir nun schon von allen Seiten versucht einzuimpfen von seiten der fpc entwickler (mailingliste) von seiten der lazarus entwickler (lazarus mailingliste) von leuten die lazarus ziemlich häufig einsetzen. und du bist so starrköpfig und versteifst dich auf den einen dummen fall mit zugriff auf einzelne zeichen das du überhaupt nicht siest das das kaum praxisrelevant ist.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von af0815 »

Christian hat geschrieben:@af du willst es nicht verstehen oder ?
Meinst DU wirklich mich mit deinem Post ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von Christian »

hast recht meinte mschnell.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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 »

Um nochmal auf plutos ürsprüngliche Frage einzugehen:
Wie Unterschiede ich, ob ein Zeichen ein UTF-8 Zeichen ist?
Wie schon oft erwähnt, kann man eigentlich nicht feststellen, ob ein byte (oder eine andere Speichereinheit) ein Zeichen ist, da es ja nur eine Zahl ist.

Bei einem String kann man über ein Byte Order Mark feststellen, dass dies einer ist:

Code: Alles auswählen

var
  s: String;
begin
  isutf8string = (s[1] = $EF) and (s[2] = $BB) and (s[3] = $BF);
end;
Leider werden diese BOMs bei UTF-8 Texten selten angegeben (Lazarus macht das auch nicht).

Wenn man aber einen String hat (bzw. einen Speicherbereich, den man als solchen behandeln will) kann man über die [url=http://de.wikipedia.org/wiki/UTF-8]UTF-8[/utf] Spezifikation ein paar test machen:

Code: Alles auswählen

var b: Byte;
    i: Integer;
begin
  if (b and $80) = $00 then  // 0xxx xxxx
    WriteLn('is ascii char') else
  if ((b and $80) = $80) and ((b and $60) = $00) then // 10xx xxxx
    WriteLn('is utf-8 follow char; the byte before this belongs to this utf-8 char, too') else
  begin  // 11xx xxxx
    i := 0;
    for i := 1 to 8 do begin
      if (b and $80) = $80 then begin
        inc(i);
        b shl 1;
      end else
        break;
    end;
    WriteLn('the next ',i,' bytes belong to one utf-8 char');
  end;
Soll heißen (bezogen auf ein Byte innerhalb des Strings):
  • Wenn das Bit 0 ist, dann ist das Byte ein ASCII-Zeichen
  • Wenn die ersten beiden Bit 10 sind, dann ist das Byte ein Folge-Zeichen eines Mehr-Byte-Zeichens (d.h. das Zeichen besteht aus mehreren Bytes)
  • Wenn die ersten beiden Bit 11 sind, dann ist das Byte das Start-Byte eines Mehr-Byte-Zeichens (d.h. Mehr-Byte-Zeichen fängt hier an). In diesem Byte wird die Anzahl der Folge-Bytes angegeben. Je ein bit = 1 (von links aus gesehen) bedeutet ein Byte mehr: %11000000 = 2Byte; %11100000 = 3Byte; %11110000 = 4Byte (jeweils inkl. Start-Byte)
Ob der String auch in UTF-8 kodiert ist, kann man aber nicht feststellen, da diese Zahlenfolge theoretisch auch durch eine andere Kodierung entstehen kann (der Benutzer hat in diesem Fall andere Zeichen eingegeben, als wir sie darstellen würden).

Ich hoffe das bringt dich irgenwie weiter.

MfG Socke
P.S.: Quelltext nicht getestet; Andere UTF-8-/Widechar-Threads nicht gelesen
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 »

@Socke
Vielen Dank für den Code. Werde ich mir aufheben. Im Moment habe ich eine andere für mich brauchbare Lösung gefunden. Die ich später noch wieder ändern werde. Aber für den Moment reicht. Hätte nicht gedacht das so eine Einfache frage doch so komplex ist. Inzwischen kann ich mir vorstellen warum das zu Fehlern führt bzw. warum mein code auch Umlaute als Unicode/UTF8 Zeichen/Als umlaut erkannt hat. Obwohl diese gar nicht in der liste sind.

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.
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 »

Socke hat geschrieben:Wie Unterschiede ich, ob ein Zeichen ein UTF-8 Zeichen ist?
Dazu muss erst einmal defiert werden, was man unter einem "UTF-8 Zeichen" verstehen möchte.
Meint er, ein Zeichen, das nicht als "nicht-länder-spezifischer ASCII Code" (also in ASCII umcodiert $20...§7E) darstellbar ist ?

-Michael
Zuletzt geändert von mschnell am Di 6. Jan 2009, 11:48, 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: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von mschnell »

theo hat geschrieben:@mschnell: Was kümmerst du dich eigentlich immer um die Einsteiger?
1) Weil Pluto genau diese Frage aufgeworfen hat.

2) Weil Pascal ursprünglich als reine Lehrsprache entwickelt worden ist und genau deshalb heute eine der sichersten und effektivsten Sprachen ist und man sie deshalb jedem, der programmieren möchte, empfehlen kann. Die C-Nachfolger Java und C# haben (besonders C#weil stark von Pascal beeinflusst) inzwischen natürlich aufgeholt. Und es wäre schade, sagen zu müssen, "Pascal ist prinzipiell gut, aber von Lazarus lässt Du besser die Finger".

Strings sind normalerweise das erste, mit dem sich jeder Programmierer beschäftigt und deshalb sollte gerade der Umgang mit Strings so intuitiv wie möglich sein.

-Michael

Benutzeravatar
theo
Beiträge: 10927
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:@mschnell: Was kümmerst du dich eigentlich immer um die Einsteiger?
1) Weil Pluto genau diese Frage aufgeworfen hat.
Pluto ist aber kein Anfänger und vor allem ist sein Vorhaben kein Anfängerprojekt.

Wie lange willst du eigentlich noch darauf rumreiten? Wenn du wenigstens mal einen brauchbaren Vorschlag machen würdest.
Und zwar nicht à la "alles konfigurierbar machen", dann kannste Lazarus nämlich gleich wegschmeissen.

mse
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

Beitrag von mse »

mschnell hat geschrieben: Strings sind normalerweise das erste, mit dem sich jeder Programmierer beschäftigt und deshalb sollte gerade der Umgang mit Strings so intuitiv wie möglich sein.
100%. Und dies gilt keinesfalls nur für Anfänger.

Martin

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 »

Pluto ist aber kein Anfänger und vor allem ist sein Vorhaben kein Anfängerprojekt.
Mein Ziel ist eine EIGENE Editor Komponenten die vergleichbar sein soll mit SynEdit. Weitere Infos zum Projekt gibt es hier: http://www.pluto.lazarusforum.de/dokuwi ... p?id=start" onclick="window.open(this.href);return false;
Allerdings habe ich das Projekt ende letzten Jahres komplett neu angefangen. Aber es wird wahrscheinlich Optisch genauso aussehen.
Und zwar nicht à la "alles konfigurierbar machen", dann kannste Lazarus nämlich gleich wegschmeissen
Was genau meinst du ? Das ist einer der Gründe warum ich z.b. nach KDE gewechselt bin. Weil GNOME so eingeschränkt ist.

Hier ist der Projekt Thread dau:
http://www.lazarusforum.de/viewtopic.php?f=11&t=1575" onclick="window.open(this.href);return false;
MFG
Michael Springwald

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

pluto hat geschrieben: Was genau meinst du ? Das ist einer der Gründe warum ich z.b. nach KDE gewechselt bin. Weil GNOME so eingeschränkt ist.
Ich meine, dass sich dann definitiv keiner mehr auskennt, wenn der eine mit der UCS-2, der andere mit der ANSI und der dritte mit der UTF-8 Version von Lazarus fährt.

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 »

achso das meinst du. Ja da gebe ich dir recht. Ein Standardisierte weg währe besser.
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 »

theo hat geschrieben:
mschnell hat geschrieben:
theo hat geschrieben:@mschnell: Was kümmerst du dich eigentlich immer um die Einsteiger?
1) Weil Pluto genau diese Frage aufgeworfen hat.
Pluto ist aber kein Anfänger
Umso schlimmer :twisted:
- Michael

Antworten