format представляет собой массив констант, поэтому в первом случае предполагается, что передается tutf8string, а во втором случае tunicodestring передается подпрограмме ассемблера.
Так что вторая часть вызывает преобразование, и это точно нормально.
Однако первая часть сложнее, так как анзистринг может быть передан непосредственно в «массив констант» без преобразования.
Однако, если вы посмотрите в исходный код ассемблера wideformatbuf(), вы увидите, что поток переходит от cvtansistr к cvtansistring, где, кажется, он преобразуется в unicodestring.
Однако весь материал format() немного запутан из-за множества перегруженных вариантов. Чтобы быть уверенным, вам придется пройти через это, что я в настоящее время не могу быстро проверить.
обновлено Я все равно отлаживал, и он действительно проходит через wideformatbuf и вызывает System.@WStrFromLStr рядом с меткой cvtansistr (sysutils.pas:10208 в моем 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. Наслаждаться!
26.01.2010