strings

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

strings

Beitrag von guennid »

Ich will diesen alten Thread nochmal aufgreifen. Auch zwei Jahre später bin ich noch genauso wenig "klug als je zuvor".

Ich will mich erstmal auf den Bezeichner STRING beschränken.

Ist folgendes korrekt:

1. Eine Variable vom Typ String (VAR abc : STRING) kann jede Menge Zeichen aufnehmen (besser gesagt, jede Menge der für diese Zeichen/Tastendrücke erforderlichen Bytes, jedenfalls mehr als 65000, die genaue Zahl scheint mir in der Praxis wenig relevant), vorausgesetzt der Compilerschalter {$H-} wird nicht verwendet.

2. Wird dieser Schalter verwendet, dann ist der Typ String gleich dem Typen ShortString und kann maximal 255 Bytes für Zeichen/Tastendrücke aufnehmen.

3. Soll die Stringlänge von vornherein begrenzt werden, z.B. auf: abc : STRING[10] dann ist maximal STRING[255] möglich. Die Maßeinheit der Zahlen ist BYTE.

Gehe ich recht in der Annahme, dass die Doku [1] an dieser Stelle nicht korrekt ist:

Code: Alles auswählen

{$H-}  
Type  
  NameString = String[10];  
  StreetString = String;
NameString can contain a maximum of 10 characters. While StreetString can contain up to 255 characters.
Nach meinen Versuchen sind es Bytes, keine Characters, auf die die Typen begrenzt werden. Characters nur, wenn ausschließlich ASCII-Zeichen < 128 verwendet werden.

[1] http://www.freepascal.org/docs-html/ref ... 350003.2.3

Grüße, guennid

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: strings

Beitrag von DiBo33 »

Nach meinen Versuchen sind es Bytes, keine Characters, auf die die Typen begrenzt werden. Characters nur, wenn ausschließlich ASCII-Zeichen < 128 verwendet werden.
Ja korrekt, die Beschreibung geht nicht auf Multybyte Character ein sondern behandelt nur Characters 0..255.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: strings

Beitrag von theo »

Stimmt nicht ganz. Im objfpc Modus sind ShortStrings default, auch ohne {$H-} , deshalb benötigt es explizit {$H+}

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: strings

Beitrag von guennid »

Danke sehr!

Darf ich das so verstehen, dass auch die ersten drei Annahmen zutreffen?

Das nächste wäre dann der Begriff AnsiString.

4. Wenn ich recht sehe, dann ist jeder String, ohne Größenbegrenzung, bei dem nicht {$H-} verwendet wird, ein AnsiString, damit eigentlich überflüssig, solange nicht {$H-} ins Spiel kommt?

5. Die Zeichen, die der Typ String/AnsiString aufnimmt, sind utf8-codiert, sofern nicht explizit eine andere Codierung angegeben wird, was bedeutet, dass z.B. ein €-Zeichen im String/Ansistring drei Byte groß ist?

6.

Code: Alles auswählen

The Length function must be used to get the length of an ansistring
Die Bezeichnung LENGTH ist etwas irreführend, zurückgegeben wird wieder Größe des Strings (die Anzahl der Bytes)?

7. Um die Länge (Zeichenzahl) zu ermitteln, muss utf8encode() verwendet werden?

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: strings

Beitrag von theo »

guennid hat geschrieben: Darf ich das so verstehen, dass auch die ersten drei Annahmen zutreffen?
Hast du meine Antwort gelesen? im Objfpc Modus (Standard) ist String=ShortString.
Also NEIN!

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: strings

Beitrag von guennid »

Hast du meine Antwort gelesen?
Nein, die Posts haben sich überschnitten. Ich bin gerade dabei, das zu verarbeiten.

[edit:]
In meiner /etc/fpc.cfg ist der Modus auskommentiert. Ich glaube, ich benötige den auch nicht.

[edit2:]
So, habe es jetzt durchprobiert und das Ergebnis entspricht Theos Hinweis:
Ohne {$H+} schluckt der Compiler zwar klaglos 146 Euro-Zeichen in einem "STRING", das Kompilat spuckt aber nur 85 wieder aus. LENGTH() meldet 255. Das, was über die 255 Byte hinausgeht, wird also abgeschnitten.
Mit {$H+} werden alle 146 Euro-Zeichen ausgegeben, length() ist jetzt 438 (1€ =3 Byte :wink: ).

Grüße, guennid

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: strings

Beitrag von Scotty »

guennid hat geschrieben:7. Um die Länge (Zeichenzahl) zu ermitteln, muss utf8encode() verwendet werden?
Das funktioniert nicht zwingend. Die richtige Funktion hierfür ist UTF8Length().

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: strings

Beitrag von theo »

Scotty hat geschrieben:
guennid hat geschrieben:7. Um die Länge (Zeichenzahl) zu ermitteln, muss utf8encode() verwendet werden?
Das funktioniert nicht zwingend. Die richtige Funktion hierfür ist UTF8Length().
Stimmt. Bzw. das funktioniert gar nicht.
Wenn schon müsste man Length(utf8decode(..)) verwenden.

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: strings

Beitrag von guennid »

Danke!
Length(utf8decode(..))
So meinte ich das auch. Ich kann mir schlecht merken, wann es de- und wann encode heißen muss :wink:

Stimmen die Annahmen 5 und 6? (natürlich unter Berücksichtigung von theos Hinweis {$H+} betreffend)

Grüße, guennid

[edit:] Ich habe zur Zeit keine Vorstellung davon, wo ich {$H+} nicht verwenden sollte. Wenn ihr das durchgehen lasst: dann heißt das doch, dass ich widestrings, utf8strings, etc. in aller Regel nicht brauche?
Zuletzt geändert von guennid am Mi 14. Sep 2011, 13:35, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: strings

Beitrag von theo »

guennid hat geschrieben: Stimmen die Annahmen 5 und 6?
Naja 5 ist etwas irreführend.
Es ist zwar so, dass standardmässig in Lazarus mit UTF-8 gearbeitet wird (d.h. was im Editor steht und was du von den Controls oder Tasten bekommst ist UTF-8)
aber dem AnsiString selber ist das eigentlich egal. Er ist ja in dieser Hinsicht nur ein "dummes" Byte-Array.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: strings

Beitrag von Scotty »

guennid hat geschrieben:So meinte ich das auch.
Length(UTF8Decode()) ist aber nicht UTF8Length(). Richtig interessant wird es, wenn du ein Programm unter Linux und Windows laufen lassen willst, das zudem Zeichen verarbeiten soll, die nicht in ISO 8859-1 enthalten sind (Kyrillisch z.B.). Dann fängst du an, Hin und Her zu konvertieren.

Code: Alles auswählen

function UTF8Length(p: PChar; ByteCount: PtrInt): PtrInt;
var
  CharLen: LongInt;
begin
  Result:=0;
  while (ByteCount>0) do begin
    inc(Result);
    CharLen:=UTF8CharacterLength(p);
    inc(p,CharLen);
    dec(ByteCount,CharLen);
  end;
end;

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: strings

Beitrag von theo »

Scotty hat geschrieben: Length(UTF8Decode()) ist aber nicht UTF8Length().
Wie meinst du das? Wegen UCS-2 <> UTF-16?
Das würde aber doch jetzt für guennid etwas weit führen oder?

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: strings

Beitrag von guennid »

Weiß ich momentan in der Tat nichts mit anzufangen.

Wie erreiche ich denn am bequemsten, dass jeder String ohne Größenbegrenzung als AnsiString interpretiert wird? Also, das, was wir bisher mit {$H+} diskutiert haben?
Reicht {$H+} vorm Hauptprogramm, oder muss der Schalter vor jede Unit, jede Routine oder gibt's noch andere Möglichkeiten?

Mein ursprünglich in TP/BP geschriebenes Programm soll ein reines Konsolenprogramm bleiben.
Zuletzt geändert von guennid am Mi 14. Sep 2011, 18:51, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: strings

Beitrag von theo »

in den Projekteinstellungen -> Compilereinstellungen -> Parsen -> AnsiStrings verwenden.

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: strings

Beitrag von guennid »

D.h. Ich benötige lazarus-ide (debian), richtig?

Geht's auch mit /etc/fpc.conf?

Code: Alles auswählen

# Semantic checking
-Sh
?

Grüße, guennid

Antworten