Apri un file ANSI e salva un file Unicode usando Delphi
-
03-07-2019 - |
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.
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;