System.AnsiString

Aus RAD Studio API Documentation
Wechseln zu: Navigation, Suche

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

AnsiString präsentiert einen dynamisch zugewiesenen String, dessen maximale Länge nur durch den verfügbaren Speicherplatz begrenzt wird.

Bitte beachten Sie, dass sich der Typ AnsiString in Delphi und C++ unterschiedlich verhält:

  • In Delphi ist er ein integrierter Typ.
  • In C++ ist er ein Alias von AnsiStringT<0>.
Hinweis: Alle folgenden Informationen sind für Delphi und C++ geeignet. Spezielle Informationen für C++ finden Sie in AnsiStringT.

Der Typ AnsiString ist eine Struktur, die String-Informationen enthält. Sein Verhalten ist vom Wert der Variable abhängig:

  • leer, wenn er einen String mit der Länge 0 enthält, ist der Zeiger nil und der String verwendet keinen weiteren Speicher.
  • nonempty, er zeigt sie auf einen dynamisch zugewiesenen Speicherblock, der einen Stringwert enthält.

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.

Hinweis: Die Namen von Multibyte-Funktionen beginnen normalerweise mit dem Wort Ansi. So ist AnsiStrPos beispielsweise die Multibyte-Version von StrPos.

Für den Typ AnsiString gelten die folgenden Merkmale:

  • Sein Speicherplatz wird auf dem Heap reserviert, aber er wird vollkommen automatisch verwaltet und erfordert keinerlei Benutzercode.
  • Seine Struktur 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.
  • Die Codeseite wird standardmäßig auf die Codeseite des Betriebssystems festgelegt. Sie kann durch Aufruf von SetMultiByteConversionCodePage geändert werden.
  • Die Indizierung von AnsiString beginnt bei 1.
Hinweis: 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. </br>Jedoch gibt es für alle Standardfunktionen zur AnsiString-Verarbeitung multibytefähige Entsprechungen, die auch die Besonderheiten länderspezifischer Zeichensätze berücksichtigen. 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 und führt Zuweisungen schneller aus. Betrachten Sie dementsprechend das folgende Verhalten von AnsiString:

  • 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 Variable) 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.
Hinweis: AnsiString wird von Delphi-Desktop- und mobilen Compilern verwendet. Weitere Informationen finden Sie unter Migrieren von Delphi-Code zu mobilen Anwendungen vom Desktop aus.
  • 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.

Beispiel für die Verwendung der Codeseite 936:

Delphi

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;

C++

typedef AnsiStringT<936> AnsiStr936;
 
void __fastcall TForm19::Button1Click(TObject *Sender)
{
  AnsiStr936 MyAnsiStr("\x20\x20\xF8\x20\x20");
  String str;
  str.SetLength(MyAnsiStr.Length()*2);
  BinToHex(MyAnsiStr.c_str(), str.c_str(), MyAnsiStr.Length()*sizeof(AnsiChar));
  ShowMessage(str);
}

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.

Siehe auch