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

标签 delphi delphi-2009

换句话说:这是否有效,即在生成 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/

相关文章:

delphi - 如何在TChart标签中显示Unicode

delphi - 当磁盘可用空间发生变化时如何收到通知?

c++ - 两列 TPopupMenu 列出右对齐的快捷方式

delphi - 如何使用外部字体?

Delphi 自定义消息处理程序

json - 使用Google云平台将语音转换为文本

sqlite - FireDac 未将 "&"符号插入 SQLITE varchar

delphi - "As"约束泛型类型的运算符

delphi - 当使用 --no-config 参数调用时,dcc32.exe 编译器会使用项目构建配置文件吗?

Delphi - 有没有更好的方法从州名获取州缩写