System.AnsiString
Delphi
type AnsiString = { built-in type };
C++
typedef AnsiStringT<0> AnsiString;
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
type typedef |
public | System.pas sysmac.h |
System | System |
説明
動的に割り当てられた文字列を表します。その最大長の制限は利用可能なメモリによってのみ変わります。
AnsiString 変数は、文字列情報を保有する構造体です。変数が空である場合(つまり、ゼロ長の文字列を含む場合)、ポインタは nil であり、文字列がストレージをさらに使用することはありません。 変数が空ではない場合、文字列値を含む、動的に割り当てられたメモリ ブロックを変数は指しています。 このメモリはヒープに割り当てられますが、その管理は完全に自動化されていて、ユーザー コードは必要ありません。 AnsiString 構造体には、32 ビット長のインジケータ、32 ビットの参照カウント、文字ごとのバイト数を表す 16 ビット データ長、そして 16 ビット コード ページが含まれています。このコード ページは、デフォルトで、オペレーティング システムのコード ページに設定されています。これは、SetMultiByteConversionCodePage を呼び出すことで変更できます。
AnsiString は、シングル バイトの文字列を表します。シングルバイト文字セット(SBCS)を使用すると、文字列の各バイトが 1 つの文字を表します。 In a multibyte character set (MBCS), the elements are still single bytes, but some characters are represented by one byte and others by more than one byte. Multibyte character sets--especially double-byte character sets (DBCS)--are widely used for Asian languages. An AnsiString can contain MBCS characters.
AnsiString のインデックスは 1 始まりです。マルチバイト文字列のインデックスは信頼性は高くありません。なぜなら、S[i] は、S における i 番目のバイトを表すからです(必ずしも i 番目の文字ではなく)。i 番目のバイトは、単一の文字であることも、文字の一部である可能性もあります。しかしながら、標準の AnsiString 文字列処理関数は、マルチバイト対応の関数で、ロケール固有の文字列の順序も実装されています。(マルチバイト関数の名前は通常 Ansi- から始まります。たとえば、マルチバイト版の StrPos は AnsiStrPos)。 マルチバイト文字がサポートされているかどうかは、オペレーティング システムや現在のロケールによって異なります。
AnsiString 変数にはポインタがあるため、2 つまたはそれ以上が、さらにメモリを消費することなく、同じ値を参照することができます。コンパイラはこれを利用して、リソースを節約して迅速に代入を実行します。 AnsiString 変数が破壊される、または、新しい値に割り当てられるときにはいつでも、古い AnsiString(変数の前の値)の参照カウントが 1 つ減少し、新しい値(もしあれば)の参照カウントが 1 つ増加します。文字列の参照カウントが 0 になると、そのメモリは解放されます。これは参照カウント処理と呼ばれます。 インデックスを使用して文字列内の 1 文字の値を変更すると、参照カウントが 1 より大きい場合にのみ文字列のコピーが作成されます。 これをコピーオンライト セマンティクスと呼びます。
リテラルが AnsiString に割り当てられると、コンパイラは AnsiString のコード ページを使用してそのリテラルを Unicode に変換し、それをリテラルに変換し直します。これにより、AnsiString にそのコード ページに有効な文字が含まれるようになります。もし無効な文字が指定された場合には、無効なバイト シーケンスがあったことを警告するため、それはバイト $3F(疑問符)に変換されます。
あるコード ページにおいて無効なバイト シーケンスが、別のコード ページでは有効である場合もある点に注意してください。
これはコードページ 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;
これを実行後、コードは次を表示します: 20 20 3F 20 20。
文字 #$F8 は #$3F と置換され、16進バイト F8 がコード ページ 936 では無効であることを示している点に注意してください。