次のコードを作成しました。
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(AString, TEncoding.ANSI);
End;
しかし、私は「W1057 'AnsiString' から 'string' への暗黙的な文字列キャスト」です。
彼に何か問題がありますか?
ありがとうございました。
次のコードを作成しました。
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(AString, TEncoding.ANSI);
End;
しかし、私は「W1057 'AnsiString' から 'string' への暗黙的な文字列キャスト」です。
彼に何か問題がありますか?
ありがとうございました。
コンストラクターは、パラメーターとして文字列TStringStream
を想定しています。代わりにanを指定すると、コンパイラは変換コードを挿入する必要があり、指定したという事実はそれを変更しません。AnsiString
TEncoding.ANSI
代わりに次のようにしてみてください。
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(string(AString));
End;
これは明示的な変換を使用し、エンコーディング関連の作業をコンパイラーに任せます。コンパイラーはそれを処理する方法を既に知っています。
D2009+ ではTStringStream
、UnicodeString
ではなく が必要AnsiString
です。AnsiString
データを Unicode に変換してから Ansi に戻すことなく、そのままの内容を書きたい場合は、TMemoryStream
代わりに次を使用します。
function AnsiStringToStream(const AString: AnsiString): TStream;
begin
Result := TMemoryStream.Create;
Result.Write(PAnsiChar(AString)^, Length(AString));
Result.Position := 0;
end;
D2009 AnsiString
+ ではコードページに対応しているため、関数に渡されるすべての文字列は、OS の既定の Ansi エンコーディングに強制されます。UTF8String
データをまったく変換せずに などの 8 ビット文字列型を渡すことができるようにする場合は、RawByteString
代わりに を使用しAnsiString
ます。
function AnsiStringToStream(const AString: RawByteString): TStream;
begin
Result := TMemoryStream.Create;
Result.Write(PAnsiChar(AString)^, Length(AString));
Result.Position := 0;
end;