2012-05-09 3 views
3

Я создал следующий код:AnsiString Стрит

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

Но я «W1057 неявной строку литой из„AnsiString“на„строки“»

Существует что-то не так с ним?

спасибо.

ответ

4

В D2009 +, TStringStream ожидает UnicodeString, а не AnsiString. Если вы просто хотите, чтобы написать содержание AnsiString как есть без необходимости конвертировать данные в Unicode, а затем обратно в Анси, используйте 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; 
7

Конструктор TStringStream ожидает строка в качестве параметра. Когда вы даете ему AnsiString, компилятор должен вставить код конверсии, а тот факт, что вы указали TEncoding.ANSI, не меняет этого.

Попробуйте, как это вместо:

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

Это использует явное преобразование, и оставляет работу кодирования, связанные до компилятора, который уже знает, как заботиться о нем.

+0

Другого варианта, чтобы отключить это предупреждение. –

+0

@DavidHeffernan: да, но желательно только локально, чтобы не потерять помощь компилятора в другом месте ... –

+0

@Marjan Почему? Я не понял, что для меня делает это предупреждение. Я выключаю его глобально. –