如何将PAnsiChar转换为WideString或string?

14

如何将 PAnsiChar 变量转换为 WideString 或者 string

4个回答

15

您只需将一个变量分配给另一个变量,让 Delphi 编译器为您执行所有的转换:

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

如果你想进行反向转换,限制讨论范围在Delphi 7中,其中Char、PChar和string均为ANSI数据类型,则应使用以下内容:

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

在这种情况下,进行此方向的转换时需要使用强制类型转换,对于WideString,数据必须明确从Unicode转换为ANSI,然后请求以空字符结尾的C字符串指针。


3
编译器会代劳,但不会默默无闻。如果你这样做,编译器将会警告你出现 W1057 隐式将 'AnsiChar' 转换为 'string'W1057 隐式将 'AnsiChar' 转换为 'WideString' - Wouter van Nifterick
1
@Wouter 在 Delphi 7 中不是使用 ANSI 字符串吗? - David Heffernan
@wouter 你提出了一个有趣的观点。在Unicode Delphi中,我关闭了关于从ansi到unicode的字符串转换的警告,因为没有数据丢失。但我可以想象出需要知道这种转换的用例。 - David Heffernan
@David:从 Ansi->Unicode 或 Unicode->Ansi 转换时,根据字符串是否使用任何大于 #127 的字符,可能会存在数据丢失。这就是为什么首先存在警告的原因。 - Remy Lebeau
1
使用显式转换可以消除D2009+中的“隐式转换”警告。它们还帮助编译器决定您实际想要执行哪些转换。正如我所说,AnsiString在D2009+中是代码页感知的,因此显式转换也有助于编译器决定要使用哪些代码页,因为现在可以在代码中定义具有静态代码页亲和性的AnsiString类型别名。 - Remy Lebeau
显示剩余5条评论

4
var
  s: AnsiString;
  w: WideString;
  p: PAnsiChar;
...
  s := p;
  w := WideString(s);

2

s:PAnsiChar;

WideString(AnsiString(s));

如果您使用的是Unicode Delphi,则可能需要:

String(AnsiString(s));

1
这些转换是不必要的。 - David Heffernan
2
+1 我有一个个人的“使用案例”,需要编译器闭嘴!(:-D) - Sam

1
在文档中查找StrPas函数。

@Woulter,请重新阅读问题。这不是关于FPC的问题。因此,您的观点完全是主观和没有根据的。 - Eugene Mayevski 'Callback
我并没有投反对票。StrPas()在大多数情况下可能能胜任,但是推荐它又是另外一回事了... - Wouter van Nifterick
如果我没记错的话,StrPas 在 Delphi 2 发布时就已经过时了。它可以完成工作,但我不认为这是一个好建议。 - David Heffernan
顺便提一下,在Delphi7中看一下StrPas本身:function StrPas(const Str: PChar): string; begin Result := Str; end;. - Wouter van Nifterick
1
文档说明:此函数仅提供向后兼容性。要将以空字符结尾的字符串转换为 AnsiString 或本机 Delphi 语言字符串,请使用类型转换或赋值。 - David Heffernan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接