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

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

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

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

Сообщение kotompazb » 21.06.2012 13:12:16

Необходимо загрузить текстовый файл в кодировке Windows 1251 в Memo.
Метод Memo1.Lines.LoadFromFile естественно не работает.
Можно конечно перекодировать файл после открытия, но может быть есть какой-то более изящный способ?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

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

Сообщение Mr.Smart » 21.06.2012 14:56:59

Код: Выделить всё
var
ls: TStringList;
begin
  ls:=TStringList.Create;
  ls.LoadFromFile('filename');
  Memo1.Lines.Text:=AnsiToUtf8(ls.Text);
  ls.Free;
end;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение kotompazb » 23.06.2012 14:04:34

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

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

Сообщение Ism » 23.06.2012 15:05:40

Со 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 секунд:
Должно быть быстрее и надежней
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение GrayEddy » 23.06.2012 15:10:45

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

Код: Выделить всё
ls.LoadFromFile('filename');
работает в 1024 раза быстрее, на 4 порядка :?
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

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

Сообщение Ism » 23.06.2012 15:26:05

Надо загрузить файл без изменений и бросить в Memo , Если StringList это умеет, хорошо
Здесь было чтото на эту тему, там предлагалось для надежности передавать в Memo из StringList построчно
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение kotompazb » 23.06.2012 16:35:16

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

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

Добавлено спустя 41 минуту 37 секунд:
Проблема с StringList обнаружилась позже в следующем:
Необходимо перебрать из StringList1, в котором был загружен оригинальный тест, и пересобрать их в StringList2, объединяя некоторые из них в одну (Задача - переформатировать текст из формата с фиксированоой длиной строки). Оказалось, что способ StringList2.text:=StringList2.text+StringList1[i] не подходит, так как добавляет в список StringList новую строку и завершает ее переводом строки (получается добавляет в массив новую отдельную строку). Пришлось пересобирать в string, а потом уже StringList2.text:=TempString. Примерно так.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

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

Сообщение v-t-l » 27.06.2012 12:20:05

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;

v-t-l
энтузиаст
 
Сообщения: 727
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Nikmedber » 11.04.2017 11:52:24

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

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

Сообщение Лекс Айрин » 11.04.2017 12:04:54

Nikmedber, примерно так
Код: Выделить всё
Str := TStringList.Create;
    Str.LoadFromFile(MyFile);
    Memo.Clear;
    Memo.Lines.Text := cp1251ToUTF8(Str.Text);
    Str.Free; 

AnsiToUTF8 это не аналог cp1251ToUTF8 и, соответственно, нельзя точно сказать в какую (с какой) кодировку она переведет текст.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Nikmedber » 11.04.2017 12:17:04

Спасибо за оперативный ответ. Ругается на cp1251ToUTF8, unit1.pas(148,19) Error: Identifier not found "cp1251ToUTF8"
Nikmedber
незнакомец
 
Сообщения: 4
Зарегистрирован: 03.07.2014 13:47:13

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

Сообщение m_guest » 11.04.2017 12:33:59

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

Подключите модуль LConvEncoding.
m_guest
постоялец
 
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

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

Сообщение Nikmedber » 11.04.2017 12:37:01

Спасибо, все получилось!
Nikmedber
незнакомец
 
Сообщения: 4
Зарегистрирован: 03.07.2014 13:47:13


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 37

Рейтинг@Mail.ru