Кодировка Windows 1251 в Memo

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Кодировка Windows 1251 в Memo

Сообщение kotompazb »

Необходимо загрузить текстовый файл в кодировке Windows 1251 в Memo.
Метод Memo1.Lines.LoadFromFile естественно не работает.
Можно конечно перекодировать файл после открытия, но может быть есть какой-то более изящный способ?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

var
 ls: TStringList;
begin
  ls:=TStringList.Create;
  ls.LoadFromFile('filename');
  Memo1.Lines.Text:=AnsiToUtf8(ls.Text);
  ls.Free;
end;
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Спасибо. В общем-то примерно так и сделал.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Со StringList неплохо, но возможны проблемы так как он делает чтото внутри себя , хотя точно не знаю

может так

Код: Выделить всё

var
  s:string;
  f:text;
  ch:char;
begin
  s:='';
  System.Assign(f,'text.txt');
  Reset(f);
  while not EOF(f) do
  begin
    read(f,ch);
    s:=s+ch;
  end;
  Memo1.Text:=AnsiToUtf8(s);


Добавлено спустя 1 минуту 36 секунд:
Должно быть быстрее и надежней
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

Т.е. вы предлагаете побайтно загрузить файл? :shock:

Код: Выделить всё

ls.LoadFromFile('filename');
работает в 1024 раза быстрее, на 4 порядка :?
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Надо загрузить файл без изменений и бросить в Memo , Если StringList это умеет, хорошо
Здесь было чтото на эту тему, там предлагалось для надежности передавать в Memo из StringList построчно
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Ism писал(а):передавать в Memo из StringList построчно

Вот именно так я и сделал, работает.

Добавлено спустя 41 минуту 37 секунд:
Проблема с StringList обнаружилась позже в следующем:
Необходимо перебрать из StringList1, в котором был загружен оригинальный тест, и пересобрать их в StringList2, объединяя некоторые из них в одну (Задача - переформатировать текст из формата с фиксированоой длиной строки). Оказалось, что способ StringList2.text:=StringList2.text+StringList1[i] не подходит, так как добавляет в список StringList новую строку и завершает ее переводом строки (получается добавляет в массив новую отдельную строку). Пришлось пересобирать в string, а потом уже StringList2.text:=TempString. Примерно так.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

c:\lazarus\components\jcf2\Utils\JcfStringUtils.pas

Код: Выделить всё

unit JcfStringUtils;

{(*}
(*------------------------------------------------------------------------------
 Delphi Code formatter source code

The Original Code is JcfStringUtils, released October 2008.
The Initial Developer of the Original Code is Paul Ishenin
Portions created by Paul Ishenin are Copyright (C) 1999-2008 Paul Ishenin
...

function FileToString(const FileName: string): AnsiString;
var
  S: TStream;
begin
  S := nil;
  try
    S := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
    SetLength(Result, S.Size);
    S.Read(PAnsiChar(Result)^, S.Size);
  finally
    S.Free;
  end;
end;

procedure StringToFile(const FileName: string; const Contents: AnsiString);
var
  S: TStream;
begin
  S := nil;
  try
    S := TFileStream.Create(FileName, fmCreate);
    S.Write(PAnsiChar(Contents)^, Length(Contents));
  finally
    S.Free;
  end;
end;

Nikmedber
незнакомец
Сообщения: 4
Зарегистрирован: 03.07.2014 13:47:13

Сообщение Nikmedber »

Windows 7 x64, Lazarus 3.0.2. Стандартный компонент Memo.
Текстовый файл в кодировке cp1251. Ни как не могу отобразить текст в Memo. В место русского текста вопросы. С AnsiToUtf8 ромбики. SysToUTF8 вопросы. Если загрузить текстовый файл в кодировке utf8, то все отображается корректно. По умолчанию в Windows в программе notepad текст сохраняется в кодировке utf8. Как можно ещё попробовать загрузить текст с кодировкой cp1251?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Nikmedber, примерно так

Код: Выделить всё

Str := TStringList.Create;
    Str.LoadFromFile(MyFile);
    Memo.Clear;
    Memo.Lines.Text := cp1251ToUTF8(Str.Text);
    Str.Free; 

AnsiToUTF8 это не аналог cp1251ToUTF8 и, соответственно, нельзя точно сказать в какую (с какой) кодировку она переведет текст.
Nikmedber
незнакомец
Сообщения: 4
Зарегистрирован: 03.07.2014 13:47:13

Сообщение Nikmedber »

Спасибо за оперативный ответ. Ругается на cp1251ToUTF8, unit1.pas(148,19) Error: Identifier not found "cp1251ToUTF8"
m_guest
постоялец
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Сообщение m_guest »

Nikmedber писал(а): Ругается на cp1251ToUTF8, unit1.pas(148,19) Error: Identifier not found "cp1251ToUTF8"

Подключите модуль LConvEncoding.
Nikmedber
незнакомец
Сообщения: 4
Зарегистрирован: 03.07.2014 13:47:13

Сообщение Nikmedber »

Спасибо, все получилось!
Ответить