Откройте файл ANSI и сохраните файл в формате Unicode с помощью Delphi

StackOverflow https://stackoverflow.com/questions/158382

Вопрос

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

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

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

Это было полезно?

Решение

Это очень просто сделать с помощью моего Файл 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;

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

Другие советы

Хорошо, используя 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top