2008-10-01 2 views
6

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

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

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

+0

В какой версии Delphi мы говорим? – 2008-10-01 16:16:56

+0

Delphi Version 2006 или 2009. – skamradt 2008-10-01 16:35:04

ответ

7

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

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

EDIT: Это его, как вы можете это сделать, используя мои вещи в 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; 

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

9

Хорошо, используя 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; 
Смежные вопросы