2010-01-26 11 views
5

En otras palabras: ¿Funciona esto, es decir, es la codificación del parámetro que se tiene en cuenta al generar el resultado de la cadena Unicode?¿Delphi maneja automáticamente los parámetros de cadenas de formato si se utilizan diferentes codificaciones de cadenas?

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

¿O es necesario emitir explícitamente los parámetros?

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

Debido a los parámetros abiertos el compilador no da ninguna pista o advertencias ...

+2

Defina lo que quiere decir con "manejar" y "trabajar". ¿Qué le gustaría * que suceda, y qué pasa en su lugar cuando lo haya probado? –

Respuesta

5

formato es variedad de const, por lo que en el primer caso, suponiendo un tutf8string se pasa, y en el segundo caso un tunicodestring se pasa a la rutina de ensamblador.

Así que la segunda parte obliga a la conversión y está bien con seguridad.

La primera parte es más difícil, ya que el ansistring se puede pasar directamente a "array of const", sin conversión.

Sin embargo, si observa el origen del ensamblador wideformatbuf(), verá que el flujo va de cvtansistr a cvtansistring, donde parece que se convierte a unicodestring.

Sin embargo, todo el formato() es un poco complicado con las muchas variantes sobrecargadas. Para estar seguro, tendrás que atravesarlo, algo que actualmente no puedo probar rápidamente.

actualizan I depurado todos modos, y de hecho pasa por wideformatbuf, y llama al sistema @ WStrFromLStr cerca de la etiqueta cvtansistr (sysutils.pas: 10208 en mi D2009)..

Conclusión: una cadena UTF-8 correctamente tipeada se convertirá correctamente a tunicodestring.

Mi programa de pruebas:

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 


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

poner un punto de interrupción en la línea marcada arriba, ponga "depuración de DCU" en en las opciones del proyecto, y de depuración utilizando F7/F8/F9. ¡Disfrutar!

+0

¡Muchas gracias! –

Cuestiones relacionadas