Difference between revisions of "UTF8 string class/de"

From Lazarus wiki
Jump to navigationJump to search
Line 1: Line 1:
 
{{LanguageBar|TbUtf8}}
 
{{LanguageBar|TbUtf8}}
 
+
'''In Bearbeitung!'''
 
__TOC__
 
__TOC__
  
Line 80: Line 80:
 
end;  
 
end;  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
=== NumberOfChars ===
 +
Liefert die Anzahl der Zeichen. Dieser Wert ist abhängig von der Option Ut8Combining.
 +
Siehe auch [[TbUtf8:Options]]

Revision as of 21:10, 17 January 2022

Deutsch (de) English (en) In Bearbeitung!

Was ist TbUtf8?

Mit TbUtf8 kann man auf einfache Weise Utf8 Strings verändern.

Problem

Bei Lazarus (Free Pascal) ist der String UTF8 kodiert. Allerdings ist der Type „String“ nichts anderes als ein dynamisches Byte- Array. Length liefert die Anzahl der Bytes im Array aber nicht die Anzahl der Zeichen. Bei UTF8 kann ein Zeichen 4Byte groß sein und mit kombinierten Zeichen sogar 7 Byte. Ein Beispiel soll das veranschaulichen. ‚Thomas‘ 6 Zeichen, 6 Byte groß. ‚Thömäs‘ 6 Zeichen, 8 Byte groß.

Lösung

Mit TbUtf8 kann man jetzt auf einfache Weise UTF8 Strings mit Sonder- und kombinierten Zeichen, wie „üäößẶặǺǻǼǽǞǟǍǎḂḃÞþÇçĆćĊċ…“ verändern und durchsuchen. Im wesentlichen besteht die Bibliothek aus einer UTF8 String Klasse (TIbUtf8).

Vorteile

  • TIbUtf8 ist eine Klasse vom Typ TInterfacedObject und muss nicht aufgeräumt werden.
  • Alle Indexe sind Zeichen basiert.
  • Alle Zeichen Rückgabewerte sind vom Typ String.
  • Liefert Anzahl der Zeichen im String.
  • Liefert Anzahl der Bytes im String.
  • Löschen von Zeichen oder Zeichengruppen.
  • Einfügen von Zeichen und Zeichengruppen.
  • Anhängen von Zeichen und Zeichengruppen.
  • Lesen / Schreiben von Zeichen und Zeichengruppen.
  • Lesen / Schreiben in eine Datei.
  • Lesen / Schreiben in einen Stream.

Nachteil

  • Da UTF8 keinen konstanten Offset von Zeichen zu Zeichen hat, ist das Suchen nach Zeichen deutlich aufwendiger. Das Iterieren über die Zeichen ist ca. 20 x langsamer als beim String. (Komfort hat eben seinen Preis)
  • Es wird etwas mehr Speicher benötigt.

Funktionsbeschreibung

Allgemein

Alle Indexe halten sich an die Pascal- Notation. Erste Zeichen hat den Index 1, letzte Zeichen hat den Index NumberOfChars. Nach dem Erzeugen einer Instanz hat Options den Wert [ut8Combining]. Nach dem Zuweisen von Text hat CurrentIndex den Wert 1.

Instanz erzeugen

Es wird immer eine Variable vom Typ „IbUtf8“ benötigt. NICHT vom Type TIbUtf8!!! Das ‚I‘ in IbUtf8 steht für Interface. Das ‚I‘ in TIbUtf8 steht für InterfacedObject. Beispiel:

procedure Demo01;
var Name:  IbUtf8;
begin
  Name:= TIbUtf8.Create('Boris');
end;

oder

procedure Demo02;
var Name:  IbUtf8;
begin
  Name:= TIbUtf8.Create;
  Name.Text:= 'Boris';
end;

Beim Verlassen der Procedure wird die Instanz automatisch aufgelöst.

Options

  • ut8Combining: Ist dieser Wert gesetzt, werden Zeichen mit kombinierten Zeichen als ein Zeichen interpretiert.
  • ut8InclusiveCurrentChar: Dieser Wert verändert das Verhalten von NextChar und BackChar. Ist der Wert gesetzt, liefert NextChar und BackChar immer das aktuelle Zeichen (CurrentIndex) und geht dann zum nächsten Zeichen. Ist der Wert nicht gesetzt, bekommt man immer das nächste Zeichen.

Beispiel:

procedure Demo03;
var
  Name: IbUtf8;
begin
  Name:= TIbUtf8.Create('Hello');
  Name.CurrentIndex:= 1;
  Name.Options:=  Name.Options + [Ut8InclusiveCurrentChar];
  while (not Name.IsStringEnd) and (Name.NextChar <> 'l') do;
  if Name.CurrentChar = 'l' then begin
   WriteLn('Richtig'):
  end;
end;

NumberOfChars

Liefert die Anzahl der Zeichen. Dieser Wert ist abhängig von der Option Ut8Combining. Siehe auch TbUtf8:Options