Формат
- это массив констант, поэтому в первом случае предполагается, что строка 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. Наслаждайтесь!