Другими словами: это работает, т.е. является кодированием параметра, принятого во внимание при генерации строкового результата unicode?
function Test: string;
var
Pattern: string;
Parameter: UTF8String;
begin
// ...
Result := Format(Pattern, [Parameter]);
end;
Или действительно ли необходимо явно бросить параметры?
Result := Format(Pattern, [string(Parameter)]);
Из-за открытых параметров компилятор не дает подсказок или предупреждений...
представляет собой массив const, так что в первом случае, предполагая, что передается tutf8string, а во втором случае - tunicodestring, передается в рутину ассемблера.
Таким образом, вторая часть форсирует преобразование и наверняка является нормальной.
Первая часть, однако, сложнее, так как ответ может быть передан непосредственно "массиву констант", без преобразования.
Однако, если посмотреть в исходники ассемблера wideformatbuf(), то можно увидеть, что поток идет от cvtansistring к cvtansistring, где он, кажется, преобразуется в unicodestring.
Однако весь функционал format() немного запутан с множеством перегруженных вариантов. Чтобы быть уверенным, вам придется пройти через это, что-то, что я в настоящее время не могу быстро протестировать.
update I debugged anyway, and it indeed passes through wideformatbuf, and calls the System.@WStrFromLStr near the cvtansistr label (sysutils.pas:10208 in my D2009).
Вывод: правильно набранная строка UTF-8 будет корректно преобразована в tunicodestring.
Моя тестовая программа:
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. Наслаждайтесь!