![]() |
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? |
AW: Wahre Zeichenanzahl ermitteln
Den String nach Unicode (WideString?) casten und darauf das Length? (oder notfalls nach ANSI)
|
AW: Wahre Zeichenanzahl ermitteln
Manchmal kann eine Lösung doch so herrlich simpel sein.
Vielen Dank an himitsu. |
AW: Wahre Zeichenanzahl ermitteln
Zitat:
Gruß K-H |
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 ![]() |
AW: Wahre Zeichenanzahl ermitteln
Zitat:
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 |
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 |
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; |
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 03:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz