Embarcadero Delphi
文字列
サーチ…
文字列型
Delphiには次の文字列型があります(人気順)。
タイプ | 最大長 | 最小サイズ | 説明 |
---|---|---|---|
string | 2GB | 16バイト | 管理された文字列。 Delphi 2009を使用したAnsiString のエイリアスと、Delphi 2009のUnicodeString エイリアスです。 |
UnicodeString | 2GB | 16バイト | UTF-16形式の管理された文字列。 |
AnsiString | 2GB | 16バイト | ユニコード前のANSI形式の管理された文字列。 Delphi 2009では、明示的なコードページインジケータを保持しています。 |
UTF8String | 2GB | 16バイト | UTF-8形式の管理されたAnsiString -8コードページを含むAnsiString として実装されます。 |
ShortString | 255文字 | 2バイト | オーバーヘッドがほとんどない従来の固定長のアンマネージ文字列 |
WideString | 2GB | 4バイト | UTF-16形式の管理された文字列であるCOM相互運用を目的としています。 Windows BSTR 型に相当します。 |
UnicodeString
とAnsiString
は参照カウントとCOW( Copy- On -Write )です。
ShortString
とWideString
は参照カウントではなく、COWセマンティクスを持ちません。
文字列
uses
System.Character;
var
S1, S2: string;
begin
S1 := 'Foo';
S2 := ToLower(S1); // Convert the string to lower-case
S1 := ToUpper(S2); // Convert the string to upper-case
チャーズ
uses
Character;
var
C1, C2: Char;
begin
C1 := 'F';
C2 := ToLower(C1); // Convert the char to lower-case
C1 := ToUpper(C2); // Convert the char to upper-case
バージョンがXE2以上の場合、 uses
句はSystem.Character
なければなりません。
大文字と小文字
uses
SysUtils;
var
S1, S2: string;
begin
S1 := 'Foo';
S2 := LowerCase(S1); // S2 := 'foo';
S1 := UpperCase(S2); // S1 := 'FOO';
割り当て
異なる文字列型への文字列の割り当てと、それらの文字列型に関する実行時環境の動作メモリ割り当て、参照カウント、文字へのインデックス付きアクセス、および該当する場合は簡単に記述されたコンパイラエラー。
var
SS5: string[5]; {a shortstring of 5 chars + 1 length byte, no trailing `0`}
WS: Widestring; {managed pointer, with a bit of compiler support}
AS: ansistring; {ansistring with the default codepage of the system}
US: unicodestring; {default string type}
U8: UTF8string;//same as AnsiString(65001)
A1251: ansistring(1251); {ansistring with codepage 1251: Cryllic set}
RB: RawbyteString; {ansistring with codepage 0: no conversion set}
begin
SS5:= 'test'; {S[0] = Length(SS254) = 4, S[1] = 't'...S[5] = undefined}
SS5:= 'test1'; {S[0] = 5, S[5] = '1', S[6] is out of bounds}
SS5:= 'test12'; {compile time error}
WS:= 'test'; {WS now points to a constant unicodestring hard compiled into the data segment}
US:= 'test'+IntToStr(1); {New unicode string is created with reference count = 1}
WS:= US; {SysAllocateStr with datacopied to dest, US refcount = 1 !}
AS:= US; {the UTF16 in US is converted to "extended" ascii taking into account the codepage in AS possibly losing data in the process}
U8:= US; {safe copy of US to U8, all data is converted from UTF16 into UTF8}
RB:= US; {RB = 'test1'#0 i.e. conversion into RawByteString uses system default codepage}
A1251:= RB; {no conversion takes place, only reference copied. Ref count incremented }
参照カウント
文字列の参照を数えることはスレッドセーフです。プロセスを保護するために、ロックと例外ハンドラが使用されます。コンパイラが参照カウントを管理するためにコンパイル時にコードを挿入する場所を示すコメントとともに、次のコードを検討してください。
procedure PassWithNoModifier(S: string);
// prologue: Increase reference count of S (if non-negative),
// and enter a try-finally block
begin
// Create a new string to hold the contents of S and 'X'. Assign the new string to S,
// thereby reducing the reference count of the string S originally pointed to and
// brining the reference count of the new string to 1.
// The string that S originally referred to is not modified.
S := S + 'X';
end;
// epilogue: Enter the `finally` section and decrease the reference count of S, which is
// now the new string. That count will be zero, so the new string will be freed.
procedure PassWithConst(const S: string);
var
TempStr: string;
// prologue: Clear TempStr and enter a try-finally block. No modification of the reference
// count of string referred to by S.
begin
// Compile-time error: S is const.
S := S + 'X';
// Create a new string to hold the contents of S and 'X'. TempStr gets a reference count
// of 1, and reference count of S remains unchanged.
TempStr := S + 'X';
end;
// epilogue: Enter the `finally` section and decrease the reference count of TempStr,
// freeing TempStr because its reference count will be zero.
上に示したように、パラメータに変更を保持するために一時的なローカル文字列を導入することは、そのパラメータに直接変更を加えるのと同じオーバヘッドを伴います。文字列const
宣言するのは、文字列パラメータが本当に読み取り専用である場合にのみ参照カウントを避けることです。ただし、関数の外部に実装の詳細が漏れないようにするには、常にconst
、 var
、またはout
いずれかを文字列パラメータに使用することをお勧めします。
エンコーディング
UnicodeString、AnsiString、WideString、UTF8Stringなどの文字列型は、それぞれのエンコーディングを使用してメモリに格納されます(詳細は文字列型を参照)。あるタイプの文字列を別のタイプの文字列に割り当てると、変換が行われる可能性があります。文字列型はエンコーディングに依存しないように設計されています。内部表現は決して使用しないでください。
クラスSysutils.TEncoding
メソッド提供GetBytes
変換するためのstring
にTBytes
(バイト配列)とGetString
変換するためのTBytes
するstring
。クラスSysutils.TEncoding
は、クラスプロパティとして多くの事前定義されたエンコーディングを提供します。
エンコーディングを扱う方法の1つは、アプリケーションでstring
型のみを使用し、特定のエンコーディング(通常はI / O操作、DLL呼び出しなど)を使用する必要があるたびにTEncoding
を使用することです。
procedure EncodingExample;
var hello,response:string;
dataout,datain:TBytes;
expectedLength:integer;
stringStream:TStringStream;
stringList:TStringList;
begin
hello := 'Hello World!Привет мир!';
dataout := SysUtils.TEncoding.UTF8.GetBytes(hello); //Conversion to UTF8
datain := SomeIOFunction(dataout); //This function expects input as TBytes in UTF8 and returns output as UTF8 encoded TBytes.
response := SysUtils.TEncoding.UTF8.GetString(datain); //Convertsion from UTF8
//In case you need to send text via pointer and length using specific encoding (used mostly for DLL calls)
dataout := SysUtils.TEncoding.GetEncoding('ISO-8859-2').GetBytes(hello); //Conversion to ISO 8859-2
DLLCall(addr(dataout[0]),length(dataout));
//The same is for cases when you get text via pointer and length
expectedLength := DLLCallToGetDataLength();
setLength(datain,expectedLength);
DLLCall(addr(datain[0]),length(datain));
response := Sysutils.TEncoding.GetEncoding(1250).getString(datain);
//TStringStream and TStringList can use encoding for I/O operations
stringList:TStringList.create;
stringList.text := hello;
stringList.saveToFile('file.txt',SysUtils.TEncoding.Unicode);
stringList.destroy;
stringStream := TStringStream(hello,SysUtils.TEncoding.Unicode);
stringStream.saveToFile('file2.txt');
stringStream.Destroy;
end;