System.AnsiString
Delphi
type AnsiString = { built-in type };
C++
typedef AnsiStringT<0> AnsiString;
Eigenschaften
Typ | Sichtbarkeit | Quelle | Unit | Übergeordnet |
---|---|---|---|---|
type typedef |
public | System.pas sysmac.h |
System | System |
Beschreibung
Repräsentiert einen dynamisch zugewiesenen String, dessen maximale Länge nur durch den verfügbaren Speicherplatz begrenzt wird.
Eine AnsiString-Variable ist eine Struktur, die String-Informationen enthält. Wenn die Variable leer ist (also einen String der Länge Null enthält), hat der Zeiger den Wert nil, und der String belegt keinen zusätzlichen Speicherplatz. Ist die Variable nicht leer, zeigt sie auf einen dynamisch zugewiesenen Speicherblock, der einen String-Wert enthält. Dieser Speicherplatz wird auf dem Heap reserviert, aber er wird vollkommen automatisch verwaltet und erfordert keinerlei Benutzercode. Die Struktur AnsiString enthält eine 32-Bit-Längenangabe, einen 32-Bit-Referenzzähler, eine 16-Bit-Datenlänge, die die Anzahl der Bytes pro Zeichen angibt, und eine 16-Bit-Codeseite. Diese Codeseite wird standardmäßig auf die Codeseite des Betriebssystems festgelegt. Sie kann durch Aufruf von SetMultiByteConversionCodePage geändert werden.
Ein AnsiString repräsentiert einen Einzelbyte-String. Bei einem Einzelbyte-Zeichensatz (SBCS = Single-Byte Character Set) repräsentiert jedes Byte eines Strings ein Zeichen. In einem Multibyte-Zeichensatz (MBCS = Multi-Byte Character Set) sind die Elemente weiterhin Einzelbytes, aber einige Zeichen werden mit einem einzelnen Byte und andere mit mehreren Bytes dargestellt. Multibyte-Zeichensätze, insbesondere Doppelbyte-Zeichensätze (DBCS = Double-Byte Character Set), werden in erster Linie für asiatische Sprachen verwendet. Ein AnsiString kann MBCS-Zeichen enthalten.
Die Indizierung von AnsiString beginnt bei 1. Die Indizierung von Multibyte-Strings ist nicht zuverlässig, weil S[i] das i-te Byte (nicht zwangsläufig das i-te Zeichen) in S repräsentiert. Das i-te Byte kann ein einzelnes Zeichen oder Teil eines Zeichens sein. Jedoch gibt es für alle Standardfunktionen zur AnsiString-Verarbeitung multibytefähige Entsprechungen, die auch die Besonderheiten länderspezifischer Zeichensätze berücksichtigen. (Die Namen von Multibyte-Funktionen beginnen normalerweise mit dem Wort Ansi. So ist AnsiStrPos beispielsweise die Multibyte-Version von StrPos.) Die Unterstützung von Multibyte-Zeichen ist betriebssystemabhängig und basiert auf dem verwendeten Gebietsschema.
Da AnsiString-Variablen Zeiger haben, können zwei oder mehrere dieser Variablen auf denselben Wert zeigen, ohne zusätzlichen Speicherplatz zu belegen. Der Compiler nützt dies zur Einsparung von Ressourcen. Auch Zuweisungen werden schneller ausgeführt. Sobald eine AnsiString-Variable freigegeben oder mit einem neuen Wert belegt wird, wird der Referenzzähler des alten AnsiString (d. h. des vorhergehenden Wertes der Variablen) verringert und der Referenzzähler des neuen Wertes (falls ein solcher zugewiesen wurde) erhöht. Erreicht der Referenzzähler eines Strings den Wert Null, wird der belegte Speicherplatz freigegeben. Dieser Vorgang wird als Referenzzählung bezeichnet. Wenn der Wert eines einzelnen Zeichens im String über einen Index geändert werden soll, wird eine Kopie des Strings angelegt. Dies ist aber nur möglich, wenn der betreffende Referenzzähler größer als 1 ist. Diesen Vorgang nennt man "Copy-on-Write"-Semantik.
Wenn einem AnsiString ein Literal zugewiesen wird, konvertiert der Compiler unter Verwendung der Codeseite des AnsiString dieses Literal in Unicode und dann wieder zurück in ein Literal. Damit wird sichergestellt, dass der AnsiString für diese Codeseite gültige Zeichen enthält. Wenn ein ungültiges Zeichen angegeben ist, wird es in Byte $3F (Fragezeichen) konvertiert, um anzugeben, das eine ungültige Byte-Sequenz gefunden wurde.
Beachten Sie jedoch, dass eine für eine Codeseite ungültige Byte-Sequenz für eine andere gültig sein kann.
Here is an example using codepage 936:
type
AnsiStr936 = type AnsiString(936);
procedure TForm1.Button1Click(Sender: TObject);
begin
const MyAnsiStr = AnsiStr936(#$20#$20#$F8#$20#$20);
var str: string;
for var Ch: AnsiChar in MyAnsiStr do
str := str+Byte(Ch).ToHexString+' ';
ShowMessage(str);
end;
After running this, the code will show: 20 20 3F 20 20.
Beachten Sie, dass das Zeichen #$F8 durch #$3F ersetzt wurde, um anzugeben, dass das hexadezimale Byte F8 für die Codeseite 936 nicht gültig ist.