Sign in Join
Wiki copytemporary

UTF8 string class/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Was ist TbUtf8?
22
33Mit der Bibliothek TbUtf8 kann man auf einfache Weise Utf8 Strings verändern.
44
55### Problem
66
77Bei 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ß.
88
99### Lösung
1010
1111Mit 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).
1212
1313### Vorteile
1414
1515- TIbUtf8 ist eine Klasse vom Typ TInterfacedObject und muss nicht aufgeräumt werden.
1616- Alle Indexe sind Zeichen basiert.
1717- Alle Zeichen Rückgabewerte sind vom Typ String.
1818- Liefert Anzahl der Zeichen im String.
1919- Liefert Anzahl der Bytes im String.
2020- Löschen von Zeichen oder Zeichengruppen.
2121- Einfügen von Zeichen und Zeichengruppen.
2222- Anhängen von Zeichen und Zeichengruppen.
2323- Lesen / Schreiben von Zeichen und Zeichengruppen.
2424- Lesen / Schreiben in eine Datei.
2525- Lesen / Schreiben in einen Stream.
2626
2727### Nachteil
2828
2929- 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)
3030- Es wird etwas mehr Speicher benötigt.
3131
3232## Download
3333
3434- GitLab FpTuxe/TbUtf8 repository
3535
36-[`FpTuxe/TbUtf8`](https://gitlab.com/FpTuxe/tbutf8)
36+```text
37+FpTuxe/TbUtf8
38+```
3739
3840- Git clone
3941
4042``` bash
4143git clone https://gitlab.com/FpTuxe/tbutf8.git
4244```
4345
4446## Installation
4547
4648Varinate 1
4749Lazarus-\>Datei-\>öffnen
4850
4951dein Pfad /tbutf8/src/tb_utf8.pas -\> Öffnen
5052
5153Lazarus-\>Projekte-\>Datei im Editor ins Projekt aufnehmen.
5254
5355Varinate 2
5456Lazarus-\>Package-\>Package-Datei (.lpk) öffen
5557
5658dein Pfad /tbutf8/src/tbutf8.lpk -\> Öffnen
5759
5860Verwenden-\>Zum Projekt hinzufügen.
5961
6062Package Fenster schliessen.
6163
6264## Funktionsbeschreibung
6365
6466### Allgemein
6567
6668Alle 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.
6769
6870### Instanz erzeugen
6971
7072Es 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:
7173
7274``` pascal
7375procedure Demo01;
7476var Name: IbUtf8;
7577begin
7678 Name:= TIbUtf8.Create('Boris');
7779end;
7880```
7981
8082oder
8183
8284``` pascal
8385procedure Demo02;
8486var Name: IbUtf8;
8587begin
8688 Name:= TIbUtf8.Create;
8789 Name.Text:= 'Boris';
8890end;
8991```
9092
9193Beim Verlassen der Procedure wird die Instanz automatisch aufgelöst.
9294
9395### Options
9496
9597- ut8Combining: Ist dieser Wert gesetzt, werden Zeichen mit kombinierten Zeichen als ein Zeichen interpretiert.
9698- 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.
9799
98100Beispiel:
99101
100102``` pascal
101103procedure Demo03;
102104var
103105 Name: IbUtf8;
104106begin
105107 Name:= TIbUtf8.Create('Hello');
106108 Name.CurrentIndex:= 1;
107109 Name.Options:= Name.Options + [Ut8InclusiveCurrentChar];
108110 while (not Name.IsStringEnd) and (Name.NextChar <> 'l') do;
109111 if Name.CurrentChar = 'l' then begin
110112 WriteLn('Richtig'):
111113 end;
112114end;
113115```
114116
115117### NumberOfChars
116118
117119Liefert die Anzahl der Zeichen. Dieser Wert ist abhängig von der Option Ut8Combining. Siehe auch Options.
118120
119121### Length
120122
121123Liefert Anzahl der Bytes die der Text im Buffer belegt.
122124
123125### IsEmpty
124126
125127Ist der String leer, so ist der Rückgabewert True.
126128
127129### IsEqual(aText)
128130
129131Ist der Text (aText) gleich dem Text in der Instanz, dann ist der Rückgabewert True.
130132
131133### IsStringEnd
132134
133135Ist CurrentIndex am Stringende (CurrentIndex \>= NumberOfChars), oder ist der String leer, dann ist der Rückgabewert True.
134136
135137### IsStringFront
136138
137139Ist CurrentIndex = 1 oder der String ist leer, dann ist der Rückgabewert True.
138140
139141### FirstChar
140142
141143Liefert das erste Zeichen des Strings. Ist der String leer, gibt es eine Exception.
142144
143145### LastChar
144146
145147Liefert das Letzte Zeichen in dem String. Ist der String leer, gibt es eine Exception.
146148
147149### NextChar
148150
149151Liefert das nächste Zeichen. Das Verhalten ist abhängig von der Option Ut8InclusiveCurrentChar. Siehe auch Options Ist der String leer, oder CurrentIndex am Ende des Strings, wird ein Leerstring zurückgegeben. CurrentIndex wird um 1 erhöht.
150152
151153### BackChar
152154
153155Liefert das vorige Zeichen. Das Verhalten ist abhängig von der Option Ut8InclusiveCurrentChar. Siehe auch Options Ist der String leer oder CurrentIndex am Anfang des Strings, wird ein Leerstring zurück gegeben. CurrentIndex wird um 1 erniedrigt.
154156
155157### Text
156158
157159Lesend: Liefert den String. Schreibend: Speichert den Text in der Instanz. Ist es kein Leerstring wird CurrentIndex auf 1 gesetzt, ansonsten auf 0.
158160
159161### CurrentIndex
160162
161163Lesend: Gibt die aktuelle Indexposition zurück. Schreibend: Setzt die neue Indexposition. Ist die Indexposition außerhalb des zulässigen Bereiches, gibt es eine Exception.
162164
163165### CurrentChar
164166
165167Liefert das Zeichen, wo CurrentIndex drauf verweist. Ist der Text leer, wird ein Leerstring zurückgegeben.
166168
167169### Chars\[Index\]
168170
169171Lesend: Liefert ein Zeichen, welches durch den Index angegeben ist. Schreibend: Ersetzt das Zeichen, welches durch den Index angegeben wird. Es können auch mehrere Zeichen angegeben werden. Ist die Indexposition außerhalb des zulässigen Bereiches, gibt es eine Exception. Beispiel:
170172
171173``` pascal
172174procedure Demo04;
173175var Name: IbUtf8;
174176begin
175177 Name:= TIbUtf8.Create('Heko');
176178 Name.Chars[3]:= 'll';
177179 if Name.Text = 'Hello' then begin
178180 WriteLn('Richtig');
179181 end;
180182end;
181183```
182184
183185### Copy
184186
185187Erzeugt eine neue Instanz mit gleichem Inhalt.
186188
187189### Copy(StartIndex, nChars)
188190
189191Erzeugt eine neue Instanz mit dem Text von StartIndex bis nChars. Ist StartIndex außerhalb des zulässigen Bereiches, gibt es eine Exception. Ist nCharts = 0, wird ein Leerstring zurück gegeben. Ist nChars \> Stringende werden die Zeichen bis Stringende kopiert.
190192
191193Beispiel:
192194
193195``` pascal
194196procedure Demo05;
195197var Name, Nachname: IbUtf8;
196198begin
197199 Name:= TIbUtf8.Creatre('Boris Weber')
198200 Nachname:= Name.Copy(7, 5);
199201 if Nachname.Text = 'Weber' then begin
200202 WriteLn('Richtig');
201203 end;
202204end;
203205```
204206
205207### CopyAsString(StartIndex, nChars)
206208
207209Verhält sich wie Copy(StartIndex, nChars), nur wird hier ein String zurückgegeben.
208210
209211### Delete(CharIndex: Cardinal)
210212
211213Löscht ein Zeichen. Ist CharIndex außerhalb des zulässigen Bereiches, gibt es eine Exception.
212214
213215### Delete(StartIndex, nChars)
214216
215217Löscht nChars ab dem StartIndex. Bei StartIndex außerhalb des zulässigen Bereiches, gibt es eine Exception. Ist nCharts = 0, wird nichts gelöscht. Ist nChars \> Stringende wird bis zum Stringende gelöscht.
216218
217219Beispiel:
218220
219221``` pascal
220222procedure Demo06;
221223var Name: IbUtf8;
222224begin
223225 Name:= TIbUtf8.Create('Boris Weber');
224226 Name.Delete(1, 6);
225227 if Name.Text = 'Weber' then begin
226228 WriteLn('Richtig');
227229 end;
228230end;
229231```
230232
231233### Insert(StartIndex, aValue)
232234
233235Insert gibt es zweimal. Einmal kann man ein String einfügen, das andere mal eine IbUtf8 Instanz. StartIndex legt fest, ab welcher Position der Text eingefügt wird. Bei StartIndex = 0, gibt es eine Exception. Bei StartIndex \> Stringende wird der Text am Ende angehängt.
234236
235237Beispiel:
236238
237239``` pascal
238240procedure Demo07;
239241var Name: IbUtf8;
240242begin
241243 Name:= TIbUtf8.Create('Bor');
242244 Name.Insert(4, 'is Weber');
243245 if Name.Text = 'Boris Weber' then begin
244246 WriteLn('Richtig');
245247 end;
246248end;
247249```
248250
249251### Kombinierte Zeichen
250252
251253Sollten die kombinierten Zeichen, die in „tb_utf8_combinings.pas“ definiert sind, nicht ausreichen, so kann einfach die Tabelle „C_COMBINIGS“ um die neuen Werte oder Wertebereiche erweitert werden. Zur Zeit sind 4 Blöcke definiert.
252254
253255---
254256*From the Free Pascal wiki, page "UTF8 string class/de", as it stood on 2022-01-24 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history