Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Wahre Zeichenanzahl ermitteln (https://www.delphipraxis.net/193298-wahre-zeichenanzahl-ermitteln.html)

PeterRettig 13. Jul 2017 14:21

Wahre Zeichenanzahl ermitteln
 
Hallo,

ich bin gerade neu mit Lazarus unterwegs und bin auf ein scheinbar simples Problem gestoßen. Ermittle die tatsächliche Anzahl von Zeichen in einem UTF8 String.
Da ein Zeichen ja länger als ein Byte sein kann, liefert die Funktion length(X) beim Wort "und" zwar korrekterweise 3 zurück, bei "Ätna" lautet das Ergebnis aber (logischerweise) 5.
Gibt es eine integrierte Funktion, die mir hier die erhoffte Zahl 4 zurückliefert?

himitsu 13. Jul 2017 14:29

AW: Wahre Zeichenanzahl ermitteln
 
Den String nach Unicode (WideString?) casten und darauf das Length? (oder notfalls nach ANSI)

PeterRettig 13. Jul 2017 15:03

AW: Wahre Zeichenanzahl ermitteln
 
Manchmal kann eine Lösung doch so herrlich simpel sein.
Vielen Dank an himitsu.

p80286 13. Jul 2017 15:24

AW: Wahre Zeichenanzahl ermitteln
 
Zitat:

Zitat von himitsu (Beitrag 1376647)
Den String nach Unicode (WideString?) casten und darauf das Length? (oder notfalls nach ANSI)

Also können die neueren Delphis nicht so richtig mit UTF8 umgehen? Sonst müßte Length() doch funktionieren?

Gruß
K-H

Fritzew 13. Jul 2017 15:28

AW: Wahre Zeichenanzahl ermitteln
 
Wenn Du es "richtig" machen willst kommst Du aber um CodePoints und passende Bibliotheken nicht herum.
in Unicode kann ein Zeichen auch aus 4 Byte bestehen, dann hast du auch mit Widestring und Co verloren.
Es gibt da mehrere Bibliotheken für Lazarus z.B http://wiki.freepascal.org/UTF8_Tools

himitsu 13. Jul 2017 15:34

AW: Wahre Zeichenanzahl ermitteln
 
Zitat:

Zitat von p80286 (Beitrag 1376655)
Also können die neueren Delphis nicht so richtig mit UTF8 umgehen? Sonst müßte Length() doch funktionieren?

FreePascal: Standard-String = UTF-8
Delphi: Standard-String = Unicode (UTF-16)


Length gibt die Anzahl der "Chars" in einem String an.
UTF-8 ist nunmal ein MultiByte-Zeichensatz, der auf ANSI aufsetzt.

ANSI: 1 Zeichen = 1 Byte/Char
UTF-8: 1 Zeichen = 1 bis zu 5 Byte/Char
Unicode (UCS-2 bzw. UTF-16): 1 Zeichen = 1 Char = 2 Byte ... zuzüglich der Surrogates mit 2 Char = 4 Byte

p80286 13. Jul 2017 17:10

AW: Wahre Zeichenanzahl ermitteln
 
@himitsu
So hab ich mir das gedacht, man muß immer noch wissen, daß es Bytes braucht um Chars zu erhalten.

Gruß
K-H

Redeemer 13. Jul 2017 21:27

AW: Wahre Zeichenanzahl ermitteln
 
UTF-8 setzt auf ASCII auf, nicht auf ANSI (Windows-1252/Latin-1). Unicode setzt auf Latin-1 auf.

UTF-16 ist aber auch ein Multi-Byte-Zeichensatz. Mal 2 und mal 4 Bytes.

Für Delphi könnte man das so machen:
Delphi-Quellcode:
function RealLength(s: string): Integer;
var
  c: Char;
begin
  Result := 0;
  for c in s do
  case Ord(c) of
    $D800..$DBFF: Continue; // High Surrogate, man könnte auch genau so gut Low Surrogate nehmen, Hauptsache man nimmt nur eins von beiden
    else inc(Result);
  end;
end;

jobo 14. Jul 2017 07:36

AW: Wahre Zeichenanzahl ermitteln
 
Ich bin überrascht.

Damals als noch Magnetbänder zur Datenspeicherung genutzt wurden, wurde die "Length" der Daten in Meter angegeben (als Beschriftung).
;)

Meine fast Lieblingsdatenbank bietet Funktionen
lengthC
und
lengthB

Man kann raten, was sie bedeuten. Analog für substr, usw.

length
gibt es natürlich auch (noch), aus alten Zeiten (Rückgabewert ist allerdings nicht in Metern)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 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