我創建了下面的代碼: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爲什麼?我還沒有弄清楚那個警告是爲我做的。我將其全局關閉。 –