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

5
换句话说:这个工作吗?也就是说,在生成Unicode字符串结果时,是否考虑了参数的编码?
function Test: string;
var
  Pattern: string;
  Parameter: UTF8String;
begin
  // ...
  Result := Format(Pattern, [Parameter]);
end;

还是必须显式转换参数吗?

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

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

2
请定义您所说的“处理”和“工作”。您希望发生什么,当您尝试时会发生什么? - Rob Kennedy
1个回答

5

格式是常量数组,因此在第一种情况下,假设传递了tutf8string,在第二种情况下,传递了tunicodestring到汇编程序。

因此,第二部分强制转换并且肯定没问题。

然而,第一部分比较困难,因为ansistring可以直接传递给“array of const”,无需转换。

然而,如果您查看wideformatbuf()汇编源代码,您会发现流程从cvtansistr到cvtansistring,其中似乎将其转换为unicodestring。

但是整个format()的东西有点混乱,有很多重载变体。要确保,您必须逐步进行测试,目前我无法快速测试。

更新 我已经调试过了,并且它确实通过wideformatbuf并调用System.@WStrFromLStr接近cvtansistr标签(sysutils.pas:10208在我的D2009中)。

结论:正确类型的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.

在上面标记的行上设置断点,打开项目选项中的“调试dcu”,并使用f7/f8/f9进行调试。享受吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接