我创建了以下代码:
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 时AnsiString
,编译器必须插入转换代码,而您指定的事实TEncoding.ANSI
并不会改变这一点。
试试这样:
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(string(AString));
End;
这使用显式转换,并将与编码相关的工作留给编译器,编译器已经知道如何处理它。
在 D2009+ 中,TStringStream
需要 a 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+ 中可识别代码页,因此传递给您的函数的任何字符串都将强制使用操作系统默认的 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;