[Решено] Текстовый файл (cp1251) в Memo.

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

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

[Решено] Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 11:29:40

Никак не получается считать текстовый файл в кодировке 1251 в мемо. Вместо кирилицы - вопросики.
Код: Выделить всё
procedure TFrmHistory.Obnov;
Var F: Text;
    S: WideString;
begin
  AssignFile(F,'History'); Reset(F);
  while not EOF(F) do
  begin
   Readln(F,S);
   Memo1.Append(AnsiToUtf8(S));
  end;
end;     

Один из вариантов, который пробовал. Другие, тоже не годятся.
Последний раз редактировалось GAMER 08.02.2012 14:39:13, всего редактировалось 1 раз.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение Odyssey » 08.02.2012 11:36:01

Либо
Код: Выделить всё
S: String;
...
Memo1.Append(AnsiToUtf8(S));
, либо
Код: Выделить всё
S: WideString;
...
Memo1.Append(Utf8Encode(S));
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 11:40:40

Не помогло.
Версии паскаля и Лазаруса - последние свн.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение SSerge » 08.02.2012 12:57:28

Функции работы с utf8 должны быть из lazutf8, а не из других модулей.

А уж WideString, кхе-кхе вообще не должно работать, ибо не настали времена.

И нельзя аргументом функции, требующей string или ansistring подставлять WideString, это вам не дельфи. Скрытые преобразования должны НЕ работать, поскольку официально заявлено что "...текущие версии RTL free pascal - unicode не поддерживают"
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 13:00:45

И как это дело таки реализовать?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение SSerge » 08.02.2012 13:09:55

Var s:string;

Остальное то же, что было.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 13:13:48

Код: Выделить всё
procedure TFrmHistory.Obnov;
Var F: Text;
    S: String;
begin
  AssignFile(F,'History'); Reset(F);
  Memo1.Clear;
  while not EOF(F) do
  begin
   Readln(F,S);
   Memo1.Append(AnsiToUtf8(S));
  end;
end;   

Вопросики остались.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение SSerge » 08.02.2012 13:20:00

uses lazutf8 есть?

Функции работы с utf8 должны быть из lazutf8, а не из других модулей.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 13:24:25

SSerge писал(а):uses lazutf8 есть?


Да.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение Vadim » 08.02.2012 13:41:31

GAMER
У меня Ваш вариант кода полностью рабочий. Считываю файл в кодировке 1251. lazutf8 в строке USES отсутствует.
FreePascal 2.6.0
Lazarus 32520.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 13:42:53

Значит либо что-то поломано в свн-версиях, либо где-то еще бага сидит.

PS. Таки проблема в свн-версии паскаля. В 2.6.0 - нормально.

Используя свн-версию знаю, на что иду. :)

Всем спасибо.

Добавлено спустя 25 минут 13 секунд:
Вообще говоря, Ansi, как-то не сильно хочеться использовать. Ведь может быть ситуация, что нужно конвертировать с другой однобайтовой кодировки в УТФ8, и эта однобайтовая кодировка не системная. Как тогда быть?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение SSerge » 08.02.2012 14:16:05

Меня натурально вштырило. :)

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
Var F,F1: Text;
    S: AnsiString;
begin
  AssignFile(F,'History'); Reset(F);
  AssignFile(F1,'Result'); Rewrite(F1);
  Memo1.Clear;
  Memo1.Append('Тест');
  while not EOF(F) do
  begin
   Readln(F,S);
   Writeln(F1,ConsoleToUTF8(s));
   Memo1.Append(ConsoleToUtf8(S));
  end;
  CloseFile(F);
  CloseFile(F1);
end;                       


Исходный файл в cp866. Как думаете, что оказалось в файле Result?

Строки, правильно перекодированные в cp1251!

CodeTyphon 2.40.

Так что, все проеброзования utf8-ansi-oem поломаны.
Соответственно SysToUtf8 вообще никакого действия на строку не оказывает.
Есть повод... отказаться... (от чего, подумали? Правильно!) от использования файлов не в UTF8. :lol:

padre_mortius: Аккуратней с выражениями. Нарушаете пункт 2 правил
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Текстовый файл (cp1251) в Memo.

Сообщение GAMER » 08.02.2012 14:23:21

2 SSerge. Версия FPC какая?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Текстовый файл (cp1251) в Memo.

Сообщение SSerge » 08.02.2012 14:25:59

2.7.1 | 0.9.31

Исходники не рыл, но похоже все из за того, что локаль в RTL не инициализирована.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Текстовый файл (cp1251) в Memo.

Сообщение Brainenjii » 08.02.2012 14:33:51

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

Unit Unit1;

{$mode objfpc}{$H+}

Interface

Uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    LConvEncoding; <- Тадам

Type

  { TForm1 }

  TForm1 = Class(TForm)
    Memo1: TMemo;
    Procedure FormCreate(Sender: TObject);
  Private
    { private declarations }
  Public
    { public declarations }
  End;

Var
  Form1: TForm1;

Implementation

{$R *.lfm}

{ TForm1 }

Procedure TForm1.FormCreate(Sender: TObject);
Var F,F1: Text;
    S: AnsiString;
begin
  AssignFile(F,'History'); Reset(F);
  AssignFile(F1,'Result'); Rewrite(F1);
  Memo1.Clear;
  Memo1.Append('Тест');
  while not EOF(F) do
  begin
   Readln(F,S);
   Writeln(F1,UTF8ToCP1251(CP866ToUTF8(s)));
   Memo1.Append(CP866ToUTF8(S));
  end;
  CloseFile(F);
  CloseFile(F1);
end;

End.

padre_mortius: Аккуратней с выражениями
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 178

Рейтинг@Mail.ru