2008-10-01 12 views
6

Por alguna razón, últimamente los archivos * .UDL en muchos de mis sistemas cliente ya no son compatibles ya que se guardaron como archivos ANSI, que ya no es compatible con el formato de archivo UNICODE esperado. El resultado final es un cuadro de diálogo de error que dice "el archivo no es un archivo compuesto válido".Abra un archivo ANSI y guarde un archivo Unicode usando Delphi

¿Cuál es la forma más fácil de abrir programáticamente estos archivos y guardarlos como un archivo Unicode? Sé que puedo hacer esto abriendo cada una en el bloc de notas y luego guardando como el mismo archivo pero con el "unicode" seleccionado en la sección de codificación del cuadro de diálogo Guardar como, pero tengo que hacer esto en el programa para reducir el soporte llamadas.

Este problema es muy fácil de duplicar, solo cree un archivo * .txt en un directorio, cambie el nombre a * .UDL, luego edítelo usando el editor de microsoft. Luego ábralo en el bloc de notas y guárdelo como un archivo codificado ANSI. Intenta abrir el udl del editor udl y te dirá que está corrupto. luego guárdelo (usando el bloc de notas) como un archivo codificado en Unicode y se abrirá nuevamente correctamente.

+0

¿De qué versión de Delphi estamos hablando? –

+0

Versión Delphi 2006 o 2009. – skamradt

Respuesta

7

Esto es muy simple de hacer con mi unidad TGpTextFile. Prepararé una pequeña muestra y la publicaré aquí.

También debería ser muy simple con el nuevo Delphi 2009 - ¿es posible que lo esté usando?

EDITAR: Este es cómo puedes hacerlo utilizando mis cosas en Delphis anterior a 2009.

var 
    strAnsi : TGpTextFile; 
    strUnicode: TGpTextFile; 
begin 
    strAnsi := TGpTextFile.Create('c:\0\test.udl'); 
    try 
    strAnsi.Reset; // you can also specify non-default 8-bit codepage here 
    strUnicode := TGpTextFile.Create('c:\0\test-out.udl'); 
    try 
     strUnicode.Rewrite([cfUnicode]); 
     while not strAnsi.Eof do 
     strUnicode.Writeln(strAnsi.Readln); 
    finally FreeAndNil(strUnicode); end; 
    finally FreeAndNil(strAnsi); end; 
end; 

Licencia: El fragmento de código anterior pertenece al dominio público. Úselo de todos modos que desee.

9

Ok, usando delphi 2009, pude encontrar el siguiente código que parece funcionar, ¿pero es la forma correcta de hacer esta conversión?

var 
    sl : TStrings; 
    FileName : string; 
begin 
    FileName := fServerDir+'configuration\hdconfig4.udl'; 
    sl := TStringList.Create; 
    try 
    sl.LoadFromFile(FileName, TEncoding.Default); 
    sl.SaveToFile(FileName, TEncoding.Unicode); 
    finally 
    sl.Free; 
    end; 
end; 
+0

Sin error abstracto para tStrings.Create ??? –

+0

Sí, TStringList debería ser mucho mejor :) – gabr

+0

Aparte de eso, el código está bien (y también funciona, acabo de comprobar). – gabr

Cuestiones relacionadas