2012-05-09 32 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爲什麼?我還沒有弄清楚那個警告是爲我做的。我將其全局關閉。 –