AnsiString To Stream

时间:2012-05-09 22:04:25

标签: delphi stream delphi-xe2 ansistring

我创建了以下代码:

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

但我是“W1057从'AnsiString'隐式字符串转换为'string'”

他有什么问题吗?

谢谢。

2 个答案:

答案 0 :(得分:7)

TStringStream构造函数需要字符串作为参数。当你给它一个AnsiString时,编译器必须插入转换代码,而你指定TEncoding.ANSI的事实不会改变它。

请尝试这样:

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

这使用显式转换,并将与编码相关的工作留给编译器,编译器已经知道如何处理它。

答案 1 :(得分:4)

在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; 

由于AnsiString在D2009 +中是代码页感知的,因此传递给您的函数的任何字符串将被强制为OS默认的Ansi编码。如果您希望能够传递任何8位字符串类型(例如UTF8String)而不转换数据,请使用RawByteString代替AnsiString

function AnsiStringToStream(const AString: RawByteString): TStream; 
begin 
  Result := TMemoryStream.Create;
  Result.Write(PAnsiChar(AString)^, Length(AString));
  Result.Position := 0; 
end;