将 PWideChar 转换为字符串。我应该使用 WideCharToString 吗?

Convert PWideChar to String. Should I use WideCharToString?

我正在使用 Delphi XE3。

在以下代码中:

procedure TForm1.Button1Click(Sender: TObject);
var
  A: PWideChar;
  B: string;
  C: string;
begin
  A := '123';

  B := A;
  C := WideCharToString(A);
end;

看来直接赋值和WideCharToString都可以将PWideChar转成字符串。在这种情况下,为什么会有人使用WideCharToString来做转换呢?

谢谢

这两个操作都从 system.pas 调用 _UStrFromPWChar 例程,因此工作方式相似。

有些人可能更喜欢显式函数调用而不是隐式转换来确定到底发生了什么。

在 Delphi 2009 年及以后,StringUnicodeString 的别名。然而,WideCharToString() 早于 UnicodeString,一直追溯到至少 Delphi 5(甚至更早),当时 StringAnsiString 的别名.

为什么需要一个函数,我不知道。 1 至少早在 Delphi 5 之前,一个 PWideChar 就可以直接赋值给一个 AnsiString,将 16 位 UCS-2/UTF-16数据转换为 8 位 ANSI 数据(通过 System 单元中的 RTL 的 _LStrFromPWChar() 函数)。

1:我怀疑,但无法确认,也许在Delphi1-4之间的某个时候,直接分配一个PWideCharString 尚不支持,需要显式函数。 AnsiString 是在 Delphi 2 中引入的,所以如果 WideCharToString() 存在于 Delphi 1 那么它很可能有助于促进 16 位 Unicode 数据到 String 的转换,当它仍然是 ShortString.

的别名

在 Delphi 2009 年引入 UnicodeString 时,旧的基于 ANSI 的 RTL 函数已更新(但未重命名)以支持 Unicode,包括 WideCharToString(),现在仅按原样复制 16 位数据而不是转换它。由于 PWideChar 也可以直接分配给 UnicodeString(通过 RTL 的 System._UStrFromPWChar() 函数),WideCharToString() 现在完全多余 2.

2:除非Embarcadero/Idera将来决定再次更改String的类型,对UTF8String说。