【问题标题】:AnsiString To StreamAnsiString 流式传输
【发布时间】:2012-05-18 11:30:43
【问题描述】:

我创建了以下代码:

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

但我是“W1057 隐式字符串从 'AnsiString' 转换为 'string'”

他有什么问题吗?

谢谢。

【问题讨论】:

    标签: delphi stream delphi-xe2 ansistring


    【解决方案1】:

    TStringStream 构造函数需要一个 字符串 作为其参数。当您给它一个 AnsiString 时,编译器必须插入转换代码,而您指定 TEncoding.ANSI 的事实并没有改变这一点。

    试试这样吧:

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

    这使用显式转换,并将与编码相关的工作留给编译器,编译器已经知道如何处理它。

    【讨论】:

    • 另一个选项是禁用该警告。
    • @DavidHeffernan:是的,但最好只在本地进行,以免在其他地方失去编译器的帮助......
    • @Marjan 为什么?我还没有弄清楚那个警告对我有什么作用。我将其全局关闭。
    • @DavidHeffernan IIRC(但自从我们切换并决定这一切以来已经很长时间了),警告用于隐式“向上”和“向下”转换。因此,全局禁用它也会消除从 Unicode 到 Ansi 的“向下”转换的隐式转换警告。尽管对于那些我们决定保留所有警告(当然是在调试/IDE 构建中)并使用显式强制转换或本地禁用编译器消息来确保不会无意中出现的警告还有另一个“数据丢失”警告。当我们不得不深入研究编码很重要的代码时,它仍然会有所帮助,因为我们很少这样做。
    【解决方案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; 
    

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 2014-03-29
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多