System.AnsiString
Delphi
type AnsiString = { built-in type };
C++
typedef AnsiStringT<0> AnsiString;
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
type typedef |
public | System.pas sysmac.h |
System | System |
説明
AnsiString は、動的に割り当てられた文字列を表します。その最大長の制限は利用可能なメモリによってのみ変わります。
AnsiString 型は、Delphi と C++ では動作が異なる点に注意することが大切です:
- Delphi では、組み込み型です。
- C++ では、AnsiStringT<0> のエイリアスです。
AnsiString 型は、文字列情報を格納する構造体で、その動作は変数の値によって変わります:
- 空の場合(格納している文字列長が 0 の場合)、ポインタは nil で、文字列は追加のストレージを使用することはありません。
- 空ではない場合、ポインタは、文字列の値を格納するために動的に割り当てられたメモリのブロックを指します。
また、AnsiString は、シングルバイト文字列を表します。シングルバイト文字セット(SBCS)を使用すると、文字列の各バイトが 1 つの文字を表します。 マルチバイト文字セット(MBCS)では、各要素がシングルバイトでも、1 バイトで表される文字も、1 バイト以上で表される文字もあります。 マルチバイト文字セット、特にダブルバイト文字セット(DBCS)は、アジア言語に広く使用されています。 AnsiString は、MBCS 文字を含んでいる場合があります。
AnsiString 型には次の特性があります:
- メモリはヒープに割り当てられますが、その管理は完全に自動化されていて、ユーザー コードは必要ありません。
- 構造体には、32 ビット長のインジケータ、32 ビットの参照カウント、文字ごとのバイト数を表す 16 ビット データ長、そして 16 ビット コード ページが含まれています。
- コード ページは、デフォルトで、オペレーティング システムのコード ページに設定されています。 これは、SetMultiByteConversionCodePage を呼び出すことで変更できます。
- AnsiString のインデックスは 1 始まりです。
- メモ: マルチバイト文字列のインデックスは信頼性は高くありません。なぜなら、S[i] は、S における i 番目のバイトを表すからです(必ずしも i 番目の文字ではなく)。 i 番目のバイトは、単一の文字であることも、文字の一部である可能性もあります。 </br>しかしながら、標準の AnsiString 文字列処理関数は、マルチバイト対応の関数で、ロケール固有の文字列の順序も実装されています。 マルチバイト文字がサポートされているかどうかは、オペレーティング システムや現在のロケールによって異なります。
AnsiString 変数にはポインタがあるため、追加のメモリを消費することなく、2 つ以上の変数が同じ値を参照することができます。コンパイラはこれを利用して、リソースを節約して迅速に代入を実行します。 これに伴い、次の AnsiString の動作について考慮してください:
- AnsiString 変数が破棄されるか新しい値が割り当てられるたびに、古い AnsiString(変数の以前の値)の参照カウントがデクリメントされ、新しい値(もしあれば)の参照カウントがインクリメントされます。
- 文字列の参照カウントが 0 に達すると、そのメモリは解放されます。この処理を、参照カウントs処理と呼びます。
- インデックスを使用して文字列内の 1 文字の値を変更すると、参照カウントが 1 より大きい場合にのみ文字列のコピーが作成されます。 これをコピーオンライト セマンティクスと呼びます。
- メモ: AnsiString は、Delphi デスクトップとモバイルのコンパイラで使用されます。詳細については、「デスクトップからモバイルへの Delphi コードの移行」を参照してください。
- リテラルが AnsiString に割り当てられると、コンパイラは AnsiString のコード ページを使用してそのリテラルを Unicode に変換し、それからリテラルに戻します。これにより、AnsiString にそのコードページに有効な文字が含まれることが保証されます。
- 無効な文字が指定された場合、無効なバイト シーケンスが見つかったことを示すためにバイト $3F(疑問符)に変換されます。
あるコード ページにおいて無効なバイト シーケンスが、別のコード ページでは有効である場合もある点に注意してください。
これはコードページ 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);
}
これを実行後、コードは次を表示します: 20 20 3F 20 20。
文字 #$F8 は #$3F と置換され、16進バイト F8 がコード ページ 936 では無効であることを示している点に注意してください。