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)

Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von pluto »

Hallo,
bisher habe ich es so gelöst:

Code: Alles auswählen

s:widestring;
  begin
    s:='ÄÖÜßäöü';  
   if pos(str[x], s) = 0) 
....
Das ist jetzt nur ein Ausschnitt aus dem kompletten Code.
Aber ich denke das Problem müsstet ihr erkennen: Ich belege den String s vor.Ich weiß aber es gibt noch mehr UTF8 Zeichen außer die die dadrin sind.
Gibt es eine bessere Möglichkeit ? Ich hoffe ihr wisst was ich meine. Um in meinem PLEdit eine Wortweise Spring Funktion einzubauen brauche ich so eine Möglichkeit. Komischerweise geht folgender Code nur mit dem Teilcode von Oben:

Code: Alles auswählen

function GetNextWort(const aX:Integer=-1):Integer;
  var
    x,z,c,cx:Integer;
    str:widestring;
    s:widestring;
  begin
    s:='ÄÖÜßäöü';
    z:=0;
    str:=Lines[CaretY];
    c:=UTF8Length(str);
    if ax = -1 then
      cx:=CaretX+1
    else begin
      cx:=aX;
    end;
 
    if str <> '' then begin
      if (str[cx] in WordDelimiters) or (cx >= c) then begin
        if (cx >= c) and (CaretY <=Count-1) then begin
          CaretY:=CaretY+1;
          cx:=0;
        end;
        result:=GetNextWort(cx+1);
        exit;
      end;
 
      for x:=cx to c+1 do begin
        if (((str[x] in WordDelimiters)) and (pos(str[x], s) = 0)) or (x >=c) or (str[x] = ' ') then begin
          z:=x;
          break;
        end;
      end; // for x
    end
    else begin
      if CaretY <=Count-1 then begin
        CaretY:=CaretY+1;
        result:=GetNextWort(0);
      end;
    end;
    result:=z;
  end; // GetNextWort
WordDelimiters ist in der unit strutils defniert und sieht so aus:

Code: Alles auswählen

WordDelimiters: set of Char = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];
Gibt es eine allgemeine Funktion die prüft ob es sich um ein UTF8 Char handelt ? Wenn ja welche ?
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 »

Was siehst du in der Titelleiste wenn du das machst:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var s:widestring;
begin
    s:='ÄÖÜßäöü';
    Caption:=Inttostr(Length(s));
end;

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 »

Die Zahl 14. Aber es sind 7 zu viel....
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:Die Zahl 14. Aber es sind 7 zu viel....
Genau. Das ist ein UTF-8 String. Es macht überhaupt keinen Sinn, den in einem WideString abzulegen.
Aber nach WideString umwandeln könnstest du ihn. Mit UTF8Decode. Dann hast du einen WideString mit dem du fast wie gewohnt arbeiten kannst.

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 nützt mir im Moment nicht viel, weil ich das schon weiß.
Das Problem ist wahrscheinlich hier:

Code: Alles auswählen

for x:=cx to c+1 do begin
        if (((str[x] in WordDelimiters))
Die Funktion arbeitet recht gut, nur bleibt sie nach einem Umlaut stehen. Also müssen die UTF8 Zeichen in WordDelimiters irgendwie erhalten sein. Genau das ist das Problem. :(
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:das nützt mir im Moment nicht viel, weil ich das schon weiß.
Wenn du das schon weisst ist ja alles klar.

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von EugenE »

vllt hilft dir das etwas weiter

Code: Alles auswählen

function IsUTF8String(S: String): Boolean;
var
   WS : WideString;
begin
   WS := UTF8Decode(S);
 
   Result := (WS <> S) AND (WS <> '');
end;

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

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von theo »

Das hilft auch nix. Seine Worddelimiters würden ja nicht mal unter ANSI für Umlaute funktionieren, da die äöü etc. gar nicht ausgenommen sind.
Aber irgendwie weiss man bei Pluto manchmal gar nicht, wo man anfangen soll mit erklären.
Er schmeisst fröhlich UTF-8 codierte Strings in einen Widestring etc. pp.
Dabei sagt er immer er wisse das schon alles.
Wir haben das Unicode Zeug schon bis zur Übelkeit besprochen. Hilft alles nix.

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 »

Du meinst es liegt am Widestring ?
Gibt es denn sowas wie ein UTF8String ?
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 »

Es liegt daran, dass du wieder mal keinen Schimmer hast was du tust ;-)
Die Unicode Sachen haben wir schon so oft besprochen.

Aber dein Code würde auch ohne Unicode nicht funktionieren, denn dein Set hat Umlaute noch drin (öäü etc.)
WordDelimiters: set of Char = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];

Die waren schon immer im Bereich > 128 und nicht in a..z, A..Z enthalten.
Schau dir mal eine ANSI oder Unicode Tabelle an und füge diese Zeichen zum Set hinzu (wenn du's schon so machen willst).
Dann wandle dein UFT8 nach WideString um und arbeite damit.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Erkennen ob das Zeichen ein UTF8 Zeichen ist

Beitrag von RSE »

Die ersten 128 Zeichen (also die eigentlichen 7-Bit ASCII Zeichen) sind in ANSI und UTF-8 gleich. Alle anderen Zeichen sind in UTF-8 mit mindestens 2 Byte codiert. Du kannst einen Unterschied zwischen UTF-8 und ANSI also nur an diesen Multibyte-Zeichen bzw. den oberen 128 8-Bit ANSI-Zeichen erkennen. In Wikipedia kannst du das auch noch mal genau nachlesen. Wenns also dumm kommt, dann besteht dein String nur aus echten ASCII-Zeichen (0 bis 127) und es gibt keinen Unterschied zwischen UTF-8 und ANSI.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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 »

Es liegt daran, dass du wieder mal keinen Schimmer hast was du tust
Dann kannst du mir bestimmt sagen warum der Code von oben meint sobald er auf ein UTF8 Zeichen störst das als Wort Anfang oder Wort Ende Zeichen erkennt. Ich habe es auch schon mit einer anderen Set versucht, da das gleiche Resultat.

Ich wollte hier kein Thread aufmachen wo munter über UTF8, Unicode und Ansi sachen geredet werden kann. Damit habe ich gar nicht gerechnet. das es dazu kommt. Evtl. ist mein Titel daran schuld. Aber ich hoffe ihr wisst das Problem im Code von Oben Liegt.
(wenn du's schon so machen willst).
Wie würdest du es denn machen ? Ich habe gerade gesehen das SynEdit dieses Problem nicht hat, da werde ich es mir mal anschauen, da habe ich auch das mit dem UTF8Char her... Evtl. ist das ja die Lösung.
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: Dann kannst du mir bestimmt sagen warum der Code von oben meint sobald er auf ein UTF8 Zeichen störst das als
Was ist ein UTF8 Zeichen??

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 »

Auch wenn ich mich jetzt wieder unbeliebt mache:

Die aktuelle Unicode-Implementierung von Lazarus ist offensichtlich nicht Pluto-tauglich (Details siehe andere "Unicode" und "UTF" Threads).

Und Pluto ist sicherlich nicht der unerfahrenste aller Pascal Einsteiger.

Die vorige nicht-Unicode - Version von Lazarus war erheblich Einsteiger-freundlicher und wer nicht wirklich Unicode braucht (oder sich "spaßeshalber" damit beschäftigen will), sollte besser bei der alten Version bleiben, weil sich die neue auch nicht auf "ANSI" statt "Unicode" konfigurieren lässt.

Es ist also stark zu hoffen, dass die nächste Version Unicode in "Pluto-tauglicher" Art einführt (z.B. Widestrings angemessen unterstützt und als default-Unicode String verwendet, oder was auch immer sich das Team intelligentes einfallen lässt: ).

Damit ist die aktuelle Version aber weder vorwärts noch rückwärts kopmpatibel :( .

Also Pluto: Am besten downgrade auf die alte "ANSI" - Version von Lazarus oder keine Umlaute etc. in Deinem Code behandeln. (D.h. die Strings, die im Code behandelt werden dürfen per se nur ASCII-Zeichen < 128 enthalten. Das gilt natürlich nicht für Strings die aus der LCL oder String-Konstanten kommen und unverändert oder nur mit + verbunden zur LCL geleitet werden. )

-Michael
Zuletzt geändert von mschnell am So 4. Jan 2009, 12:59, insgesamt 2-mal geändert.

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: Es ist also stark zu hoffen, dass die nächste Version Unicode in "Pluto-freundlicher" Art einführt
Das ist gar nicht möglich. Ich hoffe im Gegenteil, das es keine Veränderungen in diesem Bereich mehr gibt.
Mehr Automatismen führen nur zu mehr Verwirrung.
Mit der aktuellen Version lässt sich gut arbeiten. Wenn man's nicht begreifen will: Es gibt auch noch andere Hobbies... ;-)

Antworten