Откройте файл ANSI и сохраните файл Unicode с помощью Delphi. - PullRequest
6 голосов
/ 01 октября 2008

По какой-то причине в последнее время файлы * .UDL на многих моих клиентских системах больше не совместимы, поскольку они когда-то были сохранены как файлы ANSI, что больше не совместимо с ожидаемым форматом файла UNICODE. Конечным результатом является диалоговое окно с сообщением об ошибке «файл не является допустимым составным файлом».

Какой самый простой способ программно открыть эти файлы и сохранить в виде файла Unicode? Я знаю, что могу сделать это, открыв каждый из них в блокноте, а затем сохранив его как один и тот же файл, но с выбранным «юникодом» в разделе кодирования диалогового окна «Сохранить как», но мне нужно сделать это в программе, чтобы сократить поддержку вызовы.

Эту проблему очень легко воспроизвести, просто создайте файл * .txt в каталоге, переименуйте его в * .UDL, затем отредактируйте его с помощью редактора Microsoft. Затем откройте его в блокноте и сохраните как файл в формате ANSI. Попробуйте открыть UDL из редактора UDL, и он скажет вам, что он поврежден. затем сохраните его (используя блокнот) как файл в кодировке Unicode, и он снова откроется правильно.

Ответы [ 2 ]

9 голосов
/ 01 октября 2008

Хорошо, используя delphi 2009, я смог придумать следующий код, который, кажется, работает, но это правильный способ сделать это преобразование?

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;
7 голосов
/ 01 октября 2008

Это очень просто сделать с моим TGpTextFile устройством. Я соберу короткий образец и выложу здесь.

Это также должно быть очень просто с новым Delphi 2009 - возможно, вы его используете?

РЕДАКТИРОВАТЬ: Это его, как вы можете сделать это, используя мои вещи в Delphis до 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;

Лицензия: приведенный выше фрагмент кода принадлежит общественному достоянию. Используйте его так, как вам нравится.

...