Кодировка Windows 1251 в Memo
Модератор: Модераторы
Кодировка Windows 1251 в Memo
Необходимо загрузить текстовый файл в кодировке Windows 1251 в Memo.
Метод Memo1.Lines.LoadFromFile естественно не работает.
Можно конечно перекодировать файл после открытия, но может быть есть какой-то более изящный способ?
Метод Memo1.Lines.LoadFromFile естественно не работает.
Можно конечно перекодировать файл после открытия, но может быть есть какой-то более изящный способ?
Код: Выделить всё
var
ls: TStringList;
begin
ls:=TStringList.Create;
ls.LoadFromFile('filename');
Memo1.Lines.Text:=AnsiToUtf8(ls.Text);
ls.Free;
end;
Спасибо. В общем-то примерно так и сделал.
Со StringList неплохо, но возможны проблемы так как он делает чтото внутри себя , хотя точно не знаю
может так
Добавлено спустя 1 минуту 36 секунд:
Должно быть быстрее и надежней
может так
Код: Выделить всё
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 секунд:
Должно быть быстрее и надежней
Т.е. вы предлагаете побайтно загрузить файл? 
работает в 1024 раза быстрее, на 4 порядка 
Код: Выделить всё
ls.LoadFromFile('filename');Надо загрузить файл без изменений и бросить в Memo , Если StringList это умеет, хорошо
Здесь было чтото на эту тему, там предлагалось для надежности передавать в Memo из StringList построчно
Здесь было чтото на эту тему, там предлагалось для надежности передавать в Memo из StringList построчно
Ism писал(а):передавать в Memo из StringList построчно
Вот именно так я и сделал, работает.
Добавлено спустя 41 минуту 37 секунд:
Проблема с StringList обнаружилась позже в следующем:
Необходимо перебрать из StringList1, в котором был загружен оригинальный тест, и пересобрать их в StringList2, объединяя некоторые из них в одну (Задача - переформатировать текст из формата с фиксированоой длиной строки). Оказалось, что способ StringList2.text:=StringList2.text+StringList1[i] не подходит, так как добавляет в список StringList новую строку и завершает ее переводом строки (получается добавляет в массив новую отдельную строку). Пришлось пересобирать в string, а потом уже StringList2.text:=TempString. Примерно так.
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;
Windows 7 x64, Lazarus 3.0.2. Стандартный компонент Memo.
Текстовый файл в кодировке cp1251. Ни как не могу отобразить текст в Memo. В место русского текста вопросы. С AnsiToUtf8 ромбики. SysToUTF8 вопросы. Если загрузить текстовый файл в кодировке utf8, то все отображается корректно. По умолчанию в Windows в программе notepad текст сохраняется в кодировке utf8. Как можно ещё попробовать загрузить текст с кодировкой cp1251?
Текстовый файл в кодировке cp1251. Ни как не могу отобразить текст в Memo. В место русского текста вопросы. С AnsiToUtf8 ромбики. SysToUTF8 вопросы. Если загрузить текстовый файл в кодировке utf8, то все отображается корректно. По умолчанию в Windows в программе notepad текст сохраняется в кодировке utf8. Как можно ещё попробовать загрузить текст с кодировкой cp1251?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Nikmedber, примерно так
AnsiToUTF8 это не аналог cp1251ToUTF8 и, соответственно, нельзя точно сказать в какую (с какой) кодировку она переведет текст.
Код: Выделить всё
Str := TStringList.Create;
Str.LoadFromFile(MyFile);
Memo.Clear;
Memo.Lines.Text := cp1251ToUTF8(Str.Text);
Str.Free; AnsiToUTF8 это не аналог cp1251ToUTF8 и, соответственно, нельзя точно сказать в какую (с какой) кодировку она переведет текст.
Спасибо за оперативный ответ. Ругается на cp1251ToUTF8, unit1.pas(148,19) Error: Identifier not found "cp1251ToUTF8"
Nikmedber писал(а): Ругается на cp1251ToUTF8, unit1.pas(148,19) Error: Identifier not found "cp1251ToUTF8"
Подключите модуль LConvEncoding.
Спасибо, все получилось!
