Dan*_*ski 5 delphi delphi-2009
换句话说:这是否有效,即在生成unicode字符串结果时是否考虑了参数的编码?
function Test: string;
var
Pattern: string;
Parameter: UTF8String;
begin
// ...
Result := Format(Pattern, [Parameter]);
end;
Run Code Online (Sandbox Code Playgroud)
或者是否有必要明确地转换参数?
Result := Format(Pattern, [string(Parameter)]);
Run Code Online (Sandbox Code Playgroud)
由于打开参数,编译器不会给出任何提示或警告......
format是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.
Run Code Online (Sandbox Code Playgroud)
在上面标记的行上放置一个断点,在项目选项中设置"debug dcu",并使用f7/f8/f9进行调试.请享用!