Pregunta

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

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

Este problema es muy fácil de duplicar, simplemente cree un archivo * .txt en un directorio, cambie su nombre por * .UDL, y 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 desde el editor de udl y te dirá que está dañado. luego guárdelo (usando el bloc de notas) como un archivo codificado en Unicode y se abrirá de nuevo correctamente.

¿Fue útil?

Solución

Esto es muy sencillo de hacer con mi unidad TGpTextFile . Reuniré una muestra corta y la publicaré aquí.

También debería ser muy simple con el nuevo Delphi 2009, ¿quizás lo estés usando?

EDITAR: Esta es su forma de hacerlo usando mis cosas en Delphis pre-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. Úsalo como quieras.

Otros consejos

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top