Чтение текстовых файлов в кодирвке не UTF8

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

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

Чтение текстовых файлов в кодирвке не UTF8

Сообщение Ustas » 15.07.2016 11:08:28

Windows 7, Lazarus 1.6.
Столкнулся с проблемой чтение текстового файла в кодировке ANSI (да в OEM тоже).
Пробовал через TStringStream и TextFile - результат одинаковый, вопросительные знаки вместо русских букв.
Как с этим бороться?
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение sts » 15.07.2016 13:06:10

сначало надо уточнить - вопросительные знаки в какой момент - при чтении или при попытке посмотреть что прочиталось?
тобишь прочитаться может вполне нормально но вот при просмотре надо в utf8 конвертнуть, както так
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Ustas » 15.07.2016 13:09:26

После Readln(fText, S), при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Лекс Айрин » 15.07.2016 13:12:31

Код: Выделить всё
procedure TMainForm.MenuOpenClick(Sender: TObject);
var
  Str: TStringList;
begin
  Str := TStringList.Create;

  if OpenDialog1.Execute then
  begin

    MyFile := OpenDialog1.FileName;
    Caption := MyFile + ':LexEditor';
    // ожидается выбор кодировки текста  возможны ошибки!!!
    case OpenDialog1.FilterIndex of
      1, 3:  //т. к. здесь нет смысла знать шаблон открытия,то все виды вариантов
      //с разными шаблонами объединяем в один.
      begin  //utf8
                 {$IFDEF MSWINDOWS}
        Str.LoadFromFile(UTF8ToSys(MyFile));
                 {$ENDIF}
                 {$IFDEF LINUX}
        Str.LoadFromFile(MyFile);
{$ENDIF}
        MainEditor.Lines := Str;
        MainForm.ComboLangCodePage.ItemIndex:=1;
      end;
      2,4:
      begin   //win1251
                {$IFDEF MSWINDOWS}
        Str.LoadFromFile(UTF8ToSys(MyFile));
                 {$ENDIF}
                 {$IFDEF LINUX}
        Str.LoadFromFile(MyFile);
{$ENDIF}
        MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
        MainForm.ComboLangCodePage.ItemIndex:=2;
      end;
      5,6:begin  // KOI8R
                 {$IFDEF MSWINDOWS}
         Str.LoadFromFile(UTF8ToSys(MyFile));
                  {$ENDIF}
                  {$IFDEF LINUX}
         Str.LoadFromFile(MyFile);
{$ENDIF}
         MainEditor.Lines.Text := KOI8ToUTF8(Str.Text);
         MainForm.ComboLangCodePage.ItemIndex:=0;
       end;

      else
      begin
      end;
    end;
  end
  else
  begin
  end;
  Str.Free;
  MainForm.ShellTreeView1.Path:=MainForm.OpenDialog1.InitialDir;
end; 
Последний раз редактировалось Лекс Айрин 15.07.2016 13:35:25, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение SSerge » 15.07.2016 13:14:21

Код: Выделить всё
Var rb:RawByteString;
     s:string;
...

readln(txt,rb);
SetCodePage(rb,866,false);
s:=rb;


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

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Лекс Айрин » 15.07.2016 13:17:03

Ustas писал(а):при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.


не волнуйтесь... восклицательный знак всего лишь заменяет не распознанный символ на просмотре. После преобразования текста все будет нормально.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Ustas » 15.07.2016 13:25:02

Лекс Айрин писал(а):
Ustas писал(а):при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.


не волнуйтесь... восклицательный знак всего лишь заменяет не распознанный символ на просмотре. После преобразования текста все будет нормально.


ANSI: 3058.00,?????????? ??????? ?????????
AnsiToUTF8: 3058.00,���������� ������� ����������'

Кстати, это я уже пробовал метод TString.LoadFromFile. Т.е. разные методы приводят к одному результату.
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Лекс Айрин » 15.07.2016 13:32:16

Ustas, используй Cp1251ToUtf8 и будет тебе Щастье. Просто AnsiToUTF8 глючит. Это не раз поднималось на форуме.

Добавлено спустя 4 минуты 18 секунд:
ах да... чуть выше перепутал код. Заменил на правильный.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Ustas » 15.07.2016 14:04:08

Лекс Айрин писал(а):Лекс Айрин
, Cp1251ToUtf8 помогла, спасибо.
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Лекс Айрин » 15.07.2016 14:09:08

да не за что. Если что, проблемы перевода кодировок и глюков при этом периодически поднимаются.
Как я понял, ANSI это не одна таблица, а куча разных. И, видимо, подставляется не та. Причем, эта волынка тянется чуть ли не с 95 винды.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение MysticCoder » 15.07.2016 17:46:17

Лекс Айрин писал(а):Как я понял, ANSI это не одна таблица, а куча разных. И, видимо, подставляется не та. Причем, эта волынка тянется чуть ли не с 95 винды.


Как я понял, ANSI это системная кодировка по умолчанию. Её можно менять. В винде кажись она по умолчанию UTF-16.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение slyubez » 15.07.2016 21:19:27

MysticCoder писал(а):Как я понял, ANSI это системная кодировка по умолчанию. Её можно менять. В винде кажись она по умолчанию UTF-16.

Ложь. UTF-16 это разновидность unicode, в которой один символ занимает не менее 2 байт. В ANSI один символ занимает один байт, и этот режим оставлен в современных версиях Windows для совместимости с приложениями, не поддерживающими Unicode. Кодировка Win1251 - это смесь ANSI с русскими символами, и в ней один символ тоже занимает один байт.

Добавлено спустя 1 час 27 минут 9 секунд:
Да... В настройках Windows есть параметр - кодировка по умолчанию для неUnicode-приложений. И там могут прописываться и Win1251, и другие ANSI-based кодировки.
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 31.03.2015 08:44:07

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение MysticCoder » 16.07.2016 15:19:04

slyubez писал(а):Ложь. UTF-16 это разновидность unicode, в которой один символ занимает не менее 2 байт. В ANSI один символ занимает один байт


Ну шо за бред, ANSI - системная, у меня в линухе она = UTF-8, могу поставить хоть какую и один символ будет занимать много байт. в винде то же самое, какую поставишь, столько символов и будет.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение Лекс Айрин » 16.07.2016 15:35:22

MysticCoder, и что в этом хорошего?

Из-за всего этого приходится делать кучу лишних телодвижений, ибо некоторым прогам глубоко положить какую там кодировку система решила поставить. И ее собственная настраивается отдельно.

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

Re: Чтение текстовых файлов в кодирвке не UTF8

Сообщение SSerge » 16.07.2016 16:14:50

MysticCoder писал(а):в винде то же самое, какую поставишь, столько символов и будет.


Если почитатете документацию на MSDN, то внезапно выяснится, что "консольными" и "системными" могут быть только исключительно байтовые кодировки, а кодировку UTF8 windows на уровне локалей системы вообще не поддерживает.

Зы, ваши "ANSI", "SYS", "OEM" суть epic fail в названиях -- вещи просто названы не своими собственными именами: по историческим причинам, потому что так захотелось и т.п.

Оттуда же появление национального идиотизма в windows в виде разных системной и консольной кодировок - причем, за "системную" выбрана совершенно никому не нужная на тот момент, но ГОСТированная "Основная кодировка DOS" cp1251 (намертво вшитая в знакогенераторы адаптеров CGA ЭВМ "Mazovia" и "ЕС-1841" - за что они вызывали лютую ненависть потребителя), а за консольную - "колхозный стандарт" cp866, в котором символы псевдографики были на своих местах, и которую применяли повсеместно. Не могу припомнить иного подобного прецедента. Может кто приведет еще пример другой национальной windows, чтобы в ней был такой же подход (чур, беларусь и украина в сторону!)?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru