views:

256

answers:

1

In other words: Does this work, i.e. is the encoding of the parameter taken into account when generating the unicode string result?

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

Or is it necessary to explicitly cast the parameters?

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

Because of the open parameters the compiler does not give any hints or warnings...

+5  A: 

format is array of const, so in the first case, assuming an tutf8string gets passed , and in the second case an tunicodestring gets passed to the assembler routine.

So the second part forces conversion and is ok for sure.

The first part is harder though, since the ansistring can be passed directly to "array of const", without conversion.

However if you look in the wideformatbuf() assembler source, you see flow go from cvtansistr to cvtansistring, where it seems it is converted to unicodestring.

However the whole format() stuff is a bit messy with the many overloaded variants. To be sure, you'll have to step through it, something I currently can't quicky test.

updated I debugged anyway, and it indeed passes through wideformatbuf, and calls the System.@WStrFromLStr near the cvtansistr label (sysutils.pas:10208 in my D2009).

Conclusion: a properly typed UTF-8 string will be correctly converted to tunicodestring.

My test program:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;


 var u,u2 : string;
    a   :utf8string;  
 begin
    a:='asrfdsfsd';
    u:=format('%s',[a]); // breakpoint here
 end.

put a breakpoint on the marked line above, set "debug dcu's" on in project options, and debug using f7/f8/f9. Enjoy!

Marco van de Voort
Thank you very much!
DR