4

次のコードを作成しました。

Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
  Result := TStringStream.Create(AString, TEncoding.ANSI);
End;

しかし、私は「W1057 'AnsiString' から 'string' への暗黙的な文字列キャスト」です。

彼に何か問題がありますか?

ありがとうございました。

4

2 に答える 2

7

コンストラクターは、パラメーターとして文字列TStringStreamを想定しています。代わりにanを指定すると、コンパイラは変換コードを挿入する必要があり、指定したという事実はそれを変更しません。AnsiStringTEncoding.ANSI

代わりに次のようにしてみてください。

Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
  Result := TStringStream.Create(string(AString));
End;

これは明示的な変換を使用し、エンコーディング関連の作業をコンパイラーに任せます。コンパイラーはそれを処理する方法を既に知っています。

于 2012-05-09T22:10:57.777 に答える
4

D2009+ ではTStringStreamUnicodeStringではなく が必要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; 
于 2012-05-10T00:22:04.130 に答える