次のコードを作成しました。
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を指定すると、コンパイラは変換コードを挿入する必要があり、指定したという事実はそれを変更しません。AnsiStringTEncoding.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;