AnsiString To Stream
Я создал следующий код:
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(AString, TEncoding.ANSI);
End;
Но я "W1057 Неявное приведение строки из 'AnsiString' в 'string'"
С ним что-то не так?
Спасибо.
2 ответа
В 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+, ЛЮБАЯ строка, передаваемая вашей функции, будет принудительно переведена в кодировку 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;
Это использует явное преобразование и оставляет работу, связанную с кодированием, до компилятора, который уже знает, как позаботиться об этом.