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;

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

Другие вопросы по тегам