System.AnsiString

提供: RAD Studio API Documentation
移動先: 案内検索

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 より大きい場合にのみ文字列のコピーが作成されます。 これをコピーオンライト セマンティクスと呼びます。

メモ: Delphi デスクトップまたはモバイルのコンパイラによって使用される AnsiString については、「デスクトップ アプリケーションからモバイル アプリケーションへの Delphi コードの移行」を参照してください。

リテラルが 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 では無効であることを示している点に注意してください。

関連項目