Как сохранить(загрузить) текст в кодировке DOS (CP866)? DELPHI

Столкнулся недавно с необходимостью сохранить текст в DOS кодировке (CP866).

В delphi7 для сохранения функцией Writeln использовалось преобразование вида:

CharToOem(PChar(S), PChar(Buf));

В delphiXE2 функция перестала сохранять файл в новом виде.

Решение оказалось простым, в функции AssignFile можно указать кодовую страницу.

Таким образом, для сохранения строки в текстовый файл с кодовой страницей 866 (DOS) можно воспользоваться следующей функцией:

procedure WritelnOEM( FileName: string; const S: String);
var
  Buf: string;
  F: TextFile;
begin
  AssignFile(F, FileName, 866);
  ReWrite(F);
  SetLength(Buf, Length(S));
  try
    Buf := s;
 //   OemToChar(PChar(S), PChar(Buf)); старая реализация
  finally
    Writeln(F, Buf);
    CloseFile(F);
  end;
end;

Кроме того, в ряде случаев, удобно воспользоваться классом System.SysUtils.TEncoding, например для сохранения TMemo или TStrings.

procedure TForm1.Button1Click(Sender: TObject);
var
  myEncoding : TEncoding;
begin
  myEncoding := TEncoding.GetEncoding(866);
  Memo1.Lines.SaveToFile('с:\file.txt',myEncoding);
end;

или загрузки

procedure TForm1.Button2Click(Sender: TObject);
var
  myEncoding : TEncoding;
begin
  myEncoding := TEncoding.GetEncoding(866);
  Memo2.Lines.LoadFromFile('с:\file.txt',myEncoding);
end;

Comments are closed