Domanda

Per qualche motivo, ultimamente i file * .UDL su molti dei miei sistemi client non sono più compatibili poiché una volta erano salvati come file ANSI, che non è più compatibile con il formato di file UNICODE previsto. Il risultato finale è una finestra di dialogo di errore che indica "il file non è un file composto valido".

Qual è il modo più semplice per aprire programmaticamente questi file e salvarli come file unicode? So che posso farlo aprendo ognuno nel blocco note e quindi salvando come lo stesso file ma con il "unicode" selezionato nella sezione di codifica della finestra di dialogo Salva con nome, ma devo farlo nel programma per ridurre le chiamate di supporto.

Questo problema è molto semplice da duplicare, basta creare un file * .txt in una directory, rinominarlo in * .UDL, quindi modificarlo usando l'editor di Microsoft. Quindi aprilo nel blocco note e salvalo come file come file codificato ANSI. Prova ad aprire udl dall'editor udl e ti dirà che è corrotto. quindi salvalo (usando il blocco note) come file codificato Unicode e si riaprirà correttamente.

È stato utile?

Soluzione

Questo è molto semplice da fare con la mia unità TGpTextFile . Metterò un breve campione e lo pubblicherò qui.

Dovrebbe anche essere molto semplice con il nuovo Delphi 2009 - lo stai forse usando?

EDIT: questo è il modo in cui puoi farlo usando le mie cose in 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;

Licenza: il frammento di codice sopra appartiene al dominio pubblico. Usalo come preferisci.

Altri suggerimenti

Ok, usando delphi 2009, sono stato in grado di trovare il seguente codice che sembra funzionare, ma è il modo corretto di fare questa conversione?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top