System.AnsiString

De RAD Studio API Documentation
Aller à : navigation, rechercher

Delphi

type AnsiString = { built-in type };

C++

typedef  AnsiStringT<0> AnsiString;

Propriétés

Type Visibilité  Source Unité  Parent
type
typedef
public
System.pas
sysmac.h
System System


Description

AnsiString représente une chaîne allouée dynamiquement dont la longueur maximale n'est limitée que par la mémoire disponible.

Il est important de noter que le comportement du type AnsiString est différent dans Delphi et C++ :

  • Dans Delphi, c'est un type intégré.
  • Dans C++, c'est un alias de AnsiStringT<0>.
Remarque: Toutes les informations ci-dessous sont adaptées à Delphi et à C++. Pour des informations spécifiques à C++, veuillez consulter AnsiStringT.

Le type AnsiString est une structure contenant des informations de chaîne. Son comportement dépend de la valeur de la variable :

  • Quand la variable est vide, c'est-à-dire quand elle contient une chaîne de longueur nulle, le pointeur vaut nil et la chaîne n'utilise pas de mémoire supplémentaire.
  • Quand la variable est non vide, elle pointe sur un bloc de mémoire alloué dynamiquement qui contient la valeur de la chaîne.

En outre, AnsiString représente une chaîne mono-octet. Avec un jeu de caractères sur un seul octet (SBCS), chaque octet d'une chaîne représente un seul caractère. Dans un jeu de caractères multi-octets (MBCS), les éléments sont toujours des octets uniques, mais certains caractères sont représentés par un octet et d'autres par plusieurs octets. Les jeux de caractères multi-octets, en particulier les jeux sur deux octets (DBCS), sont fréquemment utilisés pour les langues asiatiques. Une variable AnsiString peut contenir des caractères MBCS.

Remarque: Le nom des fonctions portant sur les caractères multi-octets commence généralement par Ansi-. Par exemple, la version multi-octet de StrPos est AnsiStrPos.

Le type AnsiString présente les caractéristiques suivantes :

  • Sa mémoire est allouée sur le tas, mais sa gestion est entièrement automatique et ne nécessite pas de code utilisateur.
  • Sa structure contient un indicateur de longueur sur 32 bits, un compteur de références sur 32 bits, une longueur de données sur 16 bits indiquant le nombre d'octets par caractère, et une page de code sur 16 bits.
  • Cette page de code est définie par défaut sur la page de code du système d'exploitation. Elle peut être modifiée en appelant SetMultiByteConversionCodePage.
  • L'indexation de AnsiString commence à 1.
Remarque: L'indexation des chaînes multi-octets n'est pas fiable, puisque S[i] représente le ième octet (pas nécessairement le ième caractère) de S. Le ième octet peut être un caractère unique ou une partie d'un caractère. </br>Toutefois, les fonctions standard de gestion des chaînes AnsiString ont un équivalent multi-octet qui implémente aussi l'ordre des caractères en tenant compte de la localisation. La gestion des caractères multi-octets dépend du système d'exploitation et se base sur les paramètres régionaux en cours.

Puisque les variables AnsiString ont des pointeurs, plusieurs peuvent référencer la même valeur sans utiliser de mémoire supplémentaire. Le compilateur exploite ceci pour économiser les ressources et exécuter les affectations plus rapidement. Par conséquent, tenez compte du comportement suivant du type AnsiString :

  • Chaque fois qu'une variable AnsiString est détruite ou qu'une nouvelle valeur lui est affectée, le compteur de références de l'ancien AnsiString (la valeur précédente de la variable) est décrémenté et le compteur de références de la nouvelle valeur (s'il y en a une) est incrémenté.
  • Lorsque le compteur de références d'une chaîne atteint zéro, sa mémoire est désallouée. Ce processus est appelé comptage de références.
  • Si l'indexation est utilisée pour changer la valeur d'un caractère d'une chaîne, une copie de la chaîne est effectuée si, et seulement si, son compteur de références est supérieur à un. On parle alors de sémantique copie-sur-écriture.
Remarque: AnsiString est utilisé par les compilateurs de bureau et mobiles Delphi. Pour plus d'informations, voir Migration du code Delphi en mobile depuis le bureau.
  • Lorsque vous assignez un littéral à un AnsiString, le compilateur le convertit au format Unicode en utilisant la page de code de l'AnsiString, puis le reconvertit en littéral. Cette opération garantit que la chaîne AnsiString contient des caractères valides pour sa page de code.
  • Si un caractère non valide est spécifié, il est converti en octet $3F (point d'interrogation) pour signaler qu'une ou plusieurs séquences d'octets non valides ont été rencontrées.

Gardez à l'esprit qu'une séquence d'octets qui n'est pas valide pour une page de code peut l'être pour une autre page de code.

Voici un exemple d'utilisation de la page de code 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.

Notez que le caractère #$F8 a été remplacé par #$3F pour signaler que l'octet hexadécimal F8 n'est pas valide pour la page de code 936.

Voir aussi