换句话说:这是否有效,即在生成unicode字符串结果时是否考虑了参数的编码?
function Test: string;
var
Pattern: string;
Parameter: UTF8String;
begin
// ...
Result := Format(Pattern, [Parameter]);
end;
或者是否有必要明确地转换参数?
Result := Format(Pattern, [string(Parameter)]);
由于打开参数,编译器不会提供任何提示或警告......
答案 0 :(得分:5)
格式是const数组,因此在第一种情况下,假设传递了tutf8string,在第二种情况下,将一个tunicodestring传递给汇编程序例程。
所以第二部分强制转换,可以肯定。
第一部分更难,因为ansistring可以直接传递给“const数组”,而不需要转换。
但是,如果查看wideformatbuf()汇编程序源代码,您会看到flow从cvtansistr转到cvtansistring,它似乎转换为unicodestring。
然而,整个format()的东西对于许多重载变体来说有点混乱。可以肯定的是,你必须逐步完成它,这是我目前无法快速测试的。
更新无论如何我调试了它,它确实通过了wideformatbuf,并调用了cvtansistr标签附近的System。@ WStrFromLStr(我的D2009中的sysutils.pas:10208)。
结论:正确键入的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”,并使用f7 / f8 / f9进行调试。请享用!