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

时间:2010-01-26 15:21:49

标签: delphi delphi-2009

换句话说:这是否有效,即在生成unicode字符串结果时是否考虑了参数的编码?

function Test: string;
var
  Pattern: string;
  Parameter: UTF8String;
begin
  // ...
  Result := Format(Pattern, [Parameter]);
end;

或者是否有必要明确地转换参数?

Result := Format(Pattern, [string(Parameter)]);

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

1 个答案:

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