Question

Pour une raison quelconque, récemment, les fichiers * .UDL de plusieurs de mes systèmes clients ne sont plus compatibles, car ils ont déjà été enregistrés en tant que fichiers ANSI, ce qui n’est plus compatible avec le format de fichier UNICODE attendu. Le résultat final est une boîte de dialogue d'erreur indiquant "le fichier n'est pas un fichier composé valide".

Quel est le moyen le plus simple d'ouvrir ces fichiers par programmation et de les enregistrer sous forme de fichier Unicode? Je sais que je peux le faire en ouvrant chacun d'eux dans le bloc-notes, puis en les enregistrant dans le même fichier, mais avec le code "unicode". sélectionné dans la section de codage de la boîte de dialogue Enregistrer sous, mais je dois le faire dans le programme pour réduire les appels au support technique.

Ce problème est très facile à dupliquer. Il suffit de créer un fichier * .txt dans un répertoire, de le renommer en * .UDL, puis de le modifier à l’aide de l’éditeur Microsoft. Puis ouvrez-le dans le bloc-notes et enregistrez-le en tant que fichier au format ANSI. Essayez d'ouvrir udl à partir de l'éditeur udl et il vous dira qu'il est corrompu. puis enregistrez-le (en utilisant le bloc-notes) en tant que fichier codé Unicode et il s'ouvrira correctement à nouveau.

Était-ce utile?

La solution

C’est très simple à faire avec mon unité TGpTextFile . Je vais préparer un court échantillon et le poster ici.

Cela devrait également être très simple avec le nouveau Delphi 2009 - l’utilisez-vous peut-être?

EDIT: C’est comment vous pouvez le faire en utilisant mes fichiers dans Delphis d’avant 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;

Licence: le fragment de code ci-dessus appartient au domaine public. Utilisez-le comme bon vous semble.

Autres conseils

D'accord, avec Delphi 2009, j'ai pu créer le code suivant qui semble fonctionner, mais est-ce la bonne façon de faire cette conversion?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top