Конвертировать PWideChar в String. Должен ли я использовать WideCharToString? - PullRequest
0 голосов
/ 08 октября 2019

Я использую 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, чтобы сделать преобразование?

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

В Delphi 2009 и более поздних версиях String является псевдонимом для UnicodeString. Тем не менее, WideCharToString() долго предшествует UnicodeString, начиная еще с Delphi 5 (возможно, даже раньше), когда вместо String был псевдоним для AnsiString.

Почему функция когда-либо существоваланужно, я не знаю. 1 По крайней мере, начиная с Delphi 5, PWideChar может быть назначен непосредственно для AnsiString, преобразуя 16-битные данные UCS-2 / UTF-16 в 8-битные данные ANSI (через RTL _LStrFromPWChar() функция в блоке System).

1: я подозреваю , но не могу подтвердить, что, возможно, когда-нибудь между Delphi 1-4, напрямую назначив *От 1020 * до String пока не поддерживается, требующая явной функции. AnsiString был введен в Delphi 2, поэтому, если в Delphi 1 существовало WideCharToString(), то, вероятно, это помогло бы преобразовать 16-битные данные Unicode в String, когда они все еще были псевдонимом для ShortString.

Когда в Delphi 2009 была введена UnicodeString, старые функции RTL на основе ANSI были обновлены (но не переименованы) для поддержки Unicode, включая WideCharToString(), что теперь позволяет просто копировать 16-битные данные как есть. чем преобразовать это. И поскольку PWideChar также может быть назначен непосредственно для UnicodeString (через функцию RTL System._UStrFromPWChar()), WideCharToString() теперь полностью избыточен 2 .

2: если Embarcadero / Idera не решат снова изменить тип String в будущем, скажем, UTF8String.

3 голосов
/ 08 октября 2019

Обе операции вызывают _UStrFromPWChar подпрограмму из system.pas, поэтому работают аналогично.

Кто-то может предпочесть явный вызов функции, а не неявное преобразование, чтобы быть уверенным в том, что действительно происходит.

...