Обрабатывает ли Delphi параметры форматной строки автоматически, если используются разные кодировки строк? - PullRequest
5 голосов
/ 26 января 2010

Другими словами: работает ли это, то есть учитывается ли кодирование параметра при генерации результата строки Юникода?

function Test: string;
var
  Pattern: string;
  Parameter: UTF8String;
begin
  // ...
  Result := Format(Pattern, [Parameter]);
end;

Или нужно явно привести параметры?

Result := Format(Pattern, [string(Parameter)]);

Из-за открытых параметров компилятор не дает никаких подсказок или предупреждений ...

1 Ответ

5 голосов
/ 26 января 2010
Формат

- это массив констант, поэтому в первом случае предполагается, что строка tutf8 передается, а во втором - строка тунико-строки передается программе-ассемблеру.

Итак, вторая часть форсирует преобразование и, конечно, в порядке.

Тем не менее, первая часть сложнее, так как отсылка может быть передана напрямую в "массив констант" без преобразования.

Однако, если вы посмотрите на источник ассемблера wideformatbuf (), вы увидите, что поток переходит от cvtansistr к cvtansistring, где кажется, что он конвертируется в unicodestring.

Однако весь формат () немного запутан со многими перегруженными вариантами. Чтобы быть уверенным, вам придется пройти через это, что я в настоящее время не могу быстро проверить.

updated Я все равно отладил, и он действительно проходит через wideformatbuf и вызывает System. @ WStrFromLStr возле метки cvtansistr (sysutils.pas: 10208 в моем D2009).

Вывод: правильно введенная строка UTF-8 будет правильно преобразована в тунико-строку.

Моя тестовая программа:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;


 var u,u2 : string;
    a   :utf8string;  
 begin
    a:='asrfdsfsd';
    u:=format('%s',[a]); // breakpoint here
 end.

установите точку останова на отмеченной строке выше, включите "debug dcu's" в параметрах проекта и выполните отладку с помощью f7 / f8 / f9. Наслаждайтесь!

...