Откройте файл ANSI и сохраните файл в формате Unicode с помощью Delphi
-
03-07-2019 - |
Вопрос
По какой-то причине в последнее время файлы * .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;