换句话说:这是否有效,即在生成 unicode 字符串结果时是否考虑了参数的编码?
function Test: string;
var
Pattern: string;
Parameter: UTF8String;
begin
// ...
Result := Format(Pattern, [Parameter]);
end;
或者是否需要显式转换参数?
Result := Format(Pattern, [string(Parameter)]);
由于开放参数,编译器不会给出任何提示或警告...
最佳答案
format 是 const 数组,因此在第一种情况下,假设传递了一个 tutf8string,在第二种情况下,将一个 tunicodestring 传递给汇编程序例程。
所以第二部分强制转换并且肯定没问题。
第一部分比较困难,因为 ansisstring 可以直接传递到“const 数组”,无需转换。
但是,如果您查看 Wideformatbuf() 汇编程序源代码,您会看到流程从 cvtansistr 到 cvtansistring,似乎已转换为 unicodestring。
然而,整个 format() 的东西由于许多重载变体而有点困惑。可以肯定的是,您必须逐步完成它,这是我目前无法快速测试的。
更新了无论如何我都进行了调试,它确实通过了wideformatbuf,并在cvtansisstr标签附近调用了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's”,然后使用 f7/f8/f9 进行调试。享受!
关于delphi - 如果使用不同的字符串编码,Delphi 是否自动处理格式字符串参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2140333/