【问题标题】:Convert PWideChar to String. Should I use WideCharToString?将 PWideChar 转换为字符串。我应该使用 WideCharToString 吗?
【发布时间】:2020-02-05 13:19:49
【问题描述】:
我正在使用 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 进行转换?
谢谢
【问题讨论】:
标签:
string
delphi
widechar
【解决方案1】:
在 Delphi 2009 及更高版本中,String 是 UnicodeString 的别名。但是,WideCharToString() 早于 UnicodeString,可以追溯到至少 Delphi 5(可能甚至更早),当时 String 是 AnsiString 的别名。
为什么需要一个函数,我不知道。 1 至少早在 Delphi 5 中,PWideChar 可以直接分配给 AnsiString,将 16 位 UCS-2/UTF-16 数据转换为 8 位 ANSI 数据(通过 RTL 的System 单元中的_LStrFromPWChar() 函数)。
1:我怀疑,但无法确认,可能在 Delphi 1-4 之间的某个时间,尚不支持直接将 PWideChar 分配给 String,需要显式函数。 AnsiString 是在 Delphi 2 中引入的,所以如果 WideCharToString() 存在于 Delphi 1 中,那么当它仍然是 ShortString 的别名时,它可能有助于将 16 位 Unicode 数据转换为 String。
当 UnicodeString 在 Delphi 2009 中引入时,旧的基于 ANSI 的 RTL 函数已更新(但未重命名)以支持 Unicode,包括 WideCharToString(),使其现在仅按原样复制 16 位数据而不是转换它。由于PWideChar 也可以直接分配给UnicodeString(通过RTL 的System._UStrFromPWChar() 函数),WideCharToString() 现在完全是多余的2。
2:除非 Embarcadero/Idera 决定将来再次更改 String 的类型,否则请告诉 UTF8String。
【解决方案2】:
这两个操作都从system.pas 调用_UStrFromPWChar 例程,因此工作方式类似。
有些人可能更喜欢显式函数调用而不是隐式转换来确定真正发生了什么。