我创建了下面的代码:AnsiString类型要流
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(AString, TEncoding.ANSI);
End;
但我
“从‘AnsiString类型’到‘串’W1057隐串变成”有什么不对劲?
谢谢。
我创建了下面的代码:AnsiString类型要流
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(AString, TEncoding.ANSI);
End;
但我
“从‘AnsiString类型’到‘串’W1057隐串变成”有什么不对劲?
谢谢。
在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;
构造函数TStringStream
期望字符串作为其参数。如果您给它一个AnsiString
,编译器必须插入转换代码,并且您已指定TEncoding.ANSI
这一事实不会更改该代码。
尝试像这样代替:
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(string(AString));
End;
它使用一个显式转换,并且留下编码相关的工作到编译器,它已经知道如何照顾它。
另一种选择是禁用的警告。 –
@DavidHeffernan:是的,但最好只在本地,以免在其他地方失去编译器的帮助... –
@Marjan为什么?我还没有弄清楚那个警告是为我做的。我将其全局关闭。 –