string
http://www.freepascal.org/docs-html/ref ... 330003.2.2
Typ zur Speicherung von Text, Implementierung von Compiler-Einstellungen abhängig.
shortstring
http://www.freepascal.org/docs-html/ref ... 340003.2.3
Ein Array von 256 Bytes, das erste Byte bezeichnet die Anzahl gültige Zeichen. Lokale shortstring Variablen belegen Speicher im Stack.
ansistring
http://www.freepascal.org/docs-html/ref ... 350003.2.4
Ein Speicher Block im Heap, Aufbau:
Code: Alles auswählen
TAnsiRec = Packed Record
Ref,
Len : SizeInt;
First : Char;
end;
Nach First folgen die weiteren 8-Bit Zeichen des String, nach dem letzen Zeichen folgt ein #0.
In einer ansistring Variable wird ein Pointer auf First gespeichert, ein leerer ansistring wird mittels NIL Pointer dargestellt. Bei der Zuweisung eines ansistring an eine ansistring Variable wird der Pointer kopiert und Ref inkrementiert, falls der Pointer nicht NIL ist. Es muss also nicht der gesamte Stringinhalt kopiert werden, was eine wesentlich besserer Leistung ermöglicht.
Verlässt eine ansistring Variable den Sichtbarkeitsbereich, wird Ref dekrementiert falls der Pointer nicht NIL ist. Erreicht Ref Null, wird der Speicherblock freigegeben. Dieser Mechanismus gilt auch für dynamische Arrays.
Wird auf ein Zeichen schreibend zugegriffen (ansistring1[1]:= 'A';), wird zuerst eine Kopie des Speicher Blocks erstellt, falls Ref >1 ist, damit sich die Änderung nicht auf andere "Besitzer" des ursprünglichen Strings auswirken. Dies gilt *nicht* für dynamische Arrays.
widestring
http://www.freepascal.org/docs-html/ref ... 360003.2.5
Unter Linux und anderen Unix-Systemen:
Ein Speicher Block im Heap, Aufbau:
Code: Alles auswählen
TWideRec = Packed Record
Ref : SizeInt;
Len : SizeInt;
First : WideChar;
end;
Die einzelnen Zeichen sind 16Bit statt 8Bit breit, im Übrigen gilt das unter ansistring Gesagte.
Unter Windows:
Ein Speicher Block im Windows OLE-System Speicher, Aufbau:
Code: Alles auswählen
TWideRec = Packed Record
Len : DWord;
First : WideChar;
end;
Hier wird keine Referenzzählung durchgeführt, Kopieroperationen kopieren den kompletten Speicherblock. Dadurch dass kein Heapspeicher verwendet wird, können die OLE-Strings an andere Programme übergeben werden.
pchar
Ein pointer auf einen durch #0 abgeschlossenes 8Bit character array, wird hauptsächlich in der Programmiersprache C benutzt.
pwidechar
Ein pointer auf einen durch #0 abgeschlossenes 16Bit character array, wird hauptsächlich in der Programmiersprache C benutzt.
Zeichencodierung:
In der Komputerei gibt es verschiedene Vereinbarungen, wie die einzelnen Schriftzeichen in Komputerprogrammen dargestellt werden. Beispiele:
ASCII
http://en.wikipedia.org/wiki/ASCII
Benützt einzelne 7Bit Speichereinheiten (#0..#127), kann Steuerzeichen (cariage return, linefeed, form feed...) grosse und kleine lateinische Buchstaben, Ziffern und einige Satz- und Sonderzeichen darstellen, aber keine Umlaute. Zur Speicherung eines ASCII-Zeichens wird in der Regel ein Byte verwendet, das höchstwertige Bit ist dabei immer Null.
Weitere 1 Byte Codierungen verwenden die von ASCII nicht benutzten Werte #128..#255 zur Darstellung regionenspezifischer Zeichen, Beispiele:
ISO 8859-1 (Latin 1)
http://en.wikipedia.org/wiki/ISO-8859-1##ISO-8859-1
koi18-r1
http://en.wikipedia.org/wiki/KOI8-R
ANSI wird öfters als Synonym für die aktuelle Codierung unter Windows oder für Windows-1252 verwendet.
http://en.wikipedia.org/wiki/Windows-1252
Alle diese Codierungen benötigen pro Zeichen ein Byte, durch die Begrenzung auf 256 unterscheidbare Zeichen können in einem String Sonderzeichen verschiedener Regionen nicht gemischt werden.
Unicode ist ein international genormtes Bezeichnungssystem, welches für alle existierenden Schriftzeichen einen "Codepoint" bereitstellt.
http://en.wikipedia.org/wiki/Unicode
http://unicode.org/
Ein Codepoint kann Werte zwischen $00000000 und $0010FFFF besitzen. Zur Darstellung im Komputerspeicher werden verschiedene Formate verwendet:
utf-32, ein Codepoint wird in einen 32bit Wert abgebildet, benötigt 4 Bytes pro Zeichen.
utf-16, ein Codepoint wird in einen oder zwei 16Bit Werte abgebildet, benötigt 2 oder 4 Bytes pro Zeichen.
utf-8, ein Codepoint wird in ein bis vier 8Bit Werte abgebildet, benötigt 1 bis 4 Bytes pro Zeichen.
UCS-2 ist eine Untermenge von utf-16 die einige tote Sprachen und bestimmte Zeichen des traditionellen Chinesisch und weitere selten gebrauchte Zeichen nicht enthält, benötigt 2 Bytes pro Zeichen.
FPC stellt zur Laufzeit verschiedene Automatische Umwandlungen zwischen den verschiedenen Stringtypen bereit.
shortstring ansistring, die Zeichen werden unverändert übernommen.
ansistring -> pchar,
widestring -> pwidechar, falls ansi/widestring = '' (pointer ist NIL) ist, wird ein Pointer auf #0 geliefert, andernfalls der normale Pointer auf First. Dies funktioniert, da ein ansi- oder widestring immer mit einem nachfolgenden #0 abgeschlossen ist.
ansistring -> widestring, der ansistring wird vom widestringmanager unter Verwendung der aktuellen Systemcodierung in utf-16 gewandelt, unter Linux muss dafür die unit cwstring unter uses aufgeführt werden.
widestring -> ansistring, der utf-16 codierte widestring wird vom widestringmanager in die aktuelle Systemcodierung gewandelt, unter Linux muss dafür die unit cwstring unter uses aufgeführt werden. Möglicherweise können nicht alle Zeichen des widestring in der Systemcodierung dargestellt werden.
Lazarus verwendet für Texte utf-8 codierte ansistrings auf allen Systemen, die automatische Wandlung Lazarus ansistring widestring versagt daher dort, wo nicht utf-8 verwendet wird, namentlich unter Windows. Zudem ist zu beachten, dass die Einzelzeichen eines Lazarus ansistring nicht durch Index angesprochen werden können (char1:= ansistring1[1]

da utf-8 Zeichen eine variable Länge von 1 bis 4 Bytes besitzen.
Im Gegensatz dazu verwendet MSEide+MSEgui durchgehend widestrings, automatische Konvertierung ansistring widestring funktioniert und Einzelzeichen können durch Index angesprochen werden, sofern die Codepoints im UCS2 Bereich liegen.
http://sourceforge.net/projects/mseide-msegui
Martin