2010-01-26 15 views
5

In altre parole: funziona, ovvero la codifica del parametro preso in considerazione durante la generazione del risultato della stringa unicode?Delphi gestisce automaticamente i parametri della stringa di formato se vengono utilizzate codifiche di stringhe diverse?

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

Oppure è necessario eseguire il cast esplicito dei parametri?

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

causa dei parametri aperti il ​​compilatore non dà alcun suggerimento o avvisi ...

+2

Si prega di definire cosa intendete per "gestire" e "lavoro". Cosa vorresti che * * accadesse e cosa succede invece quando lo hai provato? –

risposta

5

formato è array di const, quindi nel primo caso, supponendo una tutf8string viene passato, e nel secondo caso un tunicodestring viene passato alla routine assemblatore.

Quindi la seconda parte impone la conversione ed è ok di sicuro.

La prima parte è più difficile, dato che l'ansistring può essere passato direttamente a "array of const", senza conversione.

Tuttavia, se si guarda nell'origine dell'assemblatore wideformatbuf(), si vede il flusso passare da cvtansistr a cvtansistring, dove sembra che sia stato convertito in unicodestring.

Tuttavia l'intero contenuto di format() è un po 'disordinato con le numerose varianti sovraccaricate. Per essere sicuro, dovrai attraversarlo, cosa che al momento non posso testare rapidamente.

aggiornamento ho il debug in ogni caso, e passa infatti attraverso wideformatbuf, e invita il Sistema @ WStrFromLStr vicino all'etichetta cvtansistr (sysutils.pas: 10208 nel mio D2009)..

Conclusione: una stringa UTF-8 correttamente digitata verrà convertita correttamente in tunicodestring.

Il mio programma di test:

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 


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

mettere un punto di interruzione sulla linea tracciata in precedenza, impostare "debug del DCU" su nelle opzioni di progetto e il debug utilizzando F7/F8/F9. Godere!

+0

Grazie mille! –

Problemi correlati