System.AnsiString
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
Représente une chaîne allouée dynamiquement dont la longueur maximale n'est limitée que par la mémoire disponible.
Une variable AnsiString est une structure contenant des informations de chaîne. Quand la variable est vide (contenant une chaîne de longueur zéro), le pointeur est nil et la chaîne n'utilise pas de stockage supplémentaire. Quand la variable n'est pas vide, elle pointe sur un bloc de mémoire alloué dynamiquement qui contient la valeur de la chaîne. Cette mémoire est allouée sur le tas, mais sa gestion est entièrement automatique et ne nécessite pas de code utilisateur. La structure AnsiString 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.
Un 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 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 caractères par plusieurs octets. Les jeux de caractères multi-octets, en particulier les jeux de caractères sur deux octets (DBCS), sont fréquemment utilisés pour les langues asiatiques. Un AnsiString peut contenir des caractères MBCS.
L'indexation de AnsiString commence à 1. L'indexation des chaînes multi-octets n'est pas fiable, puisque S[i] représente le ième octet (et non 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. En revanche, les fonctions standard de manipulation de chaînes AnsiString ont également un équivalent multi-octets qui implémente aussi le tri des caractères en tenant compte des paramètres régionaux (locale). Le nom des fonctions portant sur les caractères multi-octets commence généralement par Ansi-. Ainsi, la version multi-octets de StrPos est AnsiStrPos. 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.
Comme les variables AnsiString ont des pointeurs, plusieurs peuvent référencer la même valeur sans utiliser de mémoire supplémentaire. Le compilateur utilise ceci pour économiser les ressources et exécuter les affectations plus rapidement. A 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é. Si le compteur de références d'une chaîne devient nul, sa mémoire est libérée. Ce processus est appelé comptage de références. Quand des index sont utilisés pour modifier la valeur d'un seul 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.
Lorsque vous assignez un litéral à un AnsiString, le compilateur le convertit au format Unicode en utilisant sa page de code, puis le reconvertit en lité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.
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.
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.