如果使用不同的字符串编码,Delphi是否会自动处理格式字符串参数?

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)

由于打开参数,编译器不会给出任何提示或警告......

Mar*_*ort 5

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进行调试.请享用!