AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wahre Zeichenanzahl ermitteln

Ein Thema von PeterRettig · begonnen am 13. Jul 2017 · letzter Beitrag vom 14. Jul 2017
Antwort Antwort
PeterRettig

Registriert seit: 4. Jun 2003
Ort: Schleiz
65 Beiträge
 
Delphi 4 Client/Server
 
#1

Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 15:21
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?
Warum kann man Atommüll nicht auf dem Mars lagern?
Mars bringt verbrauchte Energie sofort zurück!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 15:29
Den String nach Unicode (WideString?) casten und darauf das Length? (oder notfalls nach ANSI)
$2B or not $2B
  Mit Zitat antworten Zitat
PeterRettig

Registriert seit: 4. Jun 2003
Ort: Schleiz
65 Beiträge
 
Delphi 4 Client/Server
 
#3

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 16:03
Manchmal kann eine Lösung doch so herrlich simpel sein.
Vielen Dank an himitsu.
Warum kann man Atommüll nicht auf dem Mars lagern?
Mars bringt verbrauchte Energie sofort zurück!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 16:24
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 16:28
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
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 16:34
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 18:10
@himitsu
So hab ich mir das gedacht, man muß immer noch wissen, daß es Bytes braucht um Chars zu erhalten.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Wahre Zeichenanzahl ermitteln

  Alt 13. Jul 2017, 22:27
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;
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer (14. Jul 2017 um 09:04 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Wahre Zeichenanzahl ermitteln

  Alt 14. Jul 2017, 08:36
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)
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 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