2012-05-09 42 views
3

我创建了下面的代码:AnsiString类型要流

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

但我

“从‘AnsiString类型’到‘串’W1057隐串变成”有什么不对劲?

谢谢。

回答

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

构造函数TStringStream期望字符串作为其参数。如果您给它一个AnsiString,编译器必须插入转换代码,并且您已指定TEncoding.ANSI这一事实不会更改该代码。

尝试像这样代替:

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

它使用一个显式转换,并且留下编码相关的工作到编译器,它已经知道如何照顾它。

+0

另一种选择是禁用的警告。 –

+0

@DavidHeffernan:是的,但最好只在本地,以免在其他地方失去编译器的帮助... –

+0

@Marjan为什么?我还没有弄清楚那个警告是为我做的。我将其全局关闭。 –