【问题标题】:How to convert PAnsiChar to WideString or string?如何将 PAnsiChar 转换为 WideString 或字符串?
【发布时间】:2011-04-24 07:31:38
【问题描述】:

如何将PAnsiChar 变量转换为WideStringstring

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    您只需将一个变量分配给另一个变量,然后让 Delphi 编译器为您完成所有转换:

    var
      p: PAnsiChar;
      s: string;
      w: WideString;
    ....
    s := p;
    w := p;
    

    如果您想在另一个方向进行转换,并将讨论限制在 Delphi 7 中,其中 Char、PChar、字符串都是 ANSI 数据类型,您可以使用以下内容:

    PAnsiChar(s);
    PAnsiChar(AnsiString(w));
    

    在这个方向上进行转换时需要强制转换,对于 WideString,在请求以空字符结尾的 C 字符串指针之前,必须将数据显式从 Unicode 转换为 ANSI。

    【讨论】:

    • 编译器会为你做这件事,但并非没有抱怨。如果你这样做,你会得到W1057 Implicit string cast from 'AnsiChar' to 'string'W1057 Implicit string cast from 'AnsiChar' to 'WideString'
    • @Wouter 不在具有 ANSI 字符串的 Delphi 7 中。
    • @wouter 你提出的有趣观点。在 Unicode Delphi 上,我关闭了关于从 ansi 到 unicode 的字符串转换的警告,因为没有数据丢失。但我可以想象您想了解此类转换的用例。
    • @David:从 Ansi->Unicode 或 Unicode->Ansi 传输时可能会丢失数据,具体取决于字符串是否使用任何字符 > #127。这就是警告首先存在的原因。
    • 使用显式转换可以消除 D2009+ 中的 implicit cast 警告。它们还可以帮助编译器确定您实际想要执行的转换。正如我所说,AnsiString 在 D2009+ 中支持代码页,因此显式转换也有助于编译器决定使用哪些代码页,因为现在可以在代码中定义具有静态代码页关联性的 AnsiString 类型别名。
    【解决方案2】:
    var
      s: AnsiString;
      w: WideString;
      p: PAnsiChar;
    ...
      s := p;
      w := WideString(s);
    

    【讨论】:

      【解决方案3】:

      s:PAnsiChar;

      WideString(AnsiString(s));
      

      或者在你可能想要的 unicode Delphi 上:

      String(AnsiString(s));
      

      【讨论】:

      • 不需要这些演员表。
      • +1 我有一个个人“用例”,需要编译器进行 stfu! (:-D)
      【解决方案4】:

      在文档中查找 StrPas 函数。

      【讨论】:

      • 我认为在新代码中使用 StrPas() 不是一个好习惯。还要记住,在 FPC 中它会截断你的字符串:freepascal.org/docs-html/rtl/strings/strpas.html
      • @Woulter 现在重新阅读问题。这与 FPC 无关。所以你的意见完全是主观的,没有根据的。
      • 虽然我没有投反对票。 StrPas() 可能在大多数情况下都能完成这项工作,但推荐它是另一回事......
      • 如果我没记错的话,当 Delphi 2 发布时,StrPas 就已经过时了。它会完成工作,但我不会说这是个好建议。
      • 文档指出:此功能仅用于向后兼容。要将 null 终止的字符串转换为 AnsiString 或本机 Delphi 语言字符串,请使用类型转换或赋值。
      猜你喜欢
      • 2010-09-21
      • 2011-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2020-05-24
      相关资源
      最近更新 更多