Сохранение строк с переносами кроссплатформенно.

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

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

Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 26.05.2012 20:36:28

Что-то уже пару часов туплю. Делаю банальный Save\Load Memo.Lines. Файлы, созданные под Linux не открываются правильно в Windows и наоборот, квадратики-с. Ясное дело, различаются символы конца строки. И что с этим делать? Как написать кроссплатформенно-то? А ведь мне ещё ведь и через XOR каждую букву прогонять бы надо (что, кстати, работает кроссплатформенно и отменно).

А ещё. если программа писана под Linux, то под Виндой падает от русских букв в пути к файлу. Что не мешает среде работать с русскими именами нормально, а вот программу я явно как-то не так пишу. Ткните носом, чо делать-то, а?

Изображение

Изображение
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение Ism » 26.05.2012 21:04:47

1 В винде кодировка ansi, в линукс UTF8 , у лазаруса были всегда проблемы с русскими путями
2 В линукс и windows в текстовых файлах символы конца строк отличаются
3 Если хотите сохранить файл с русским именем конвертируйте в ansi имя файла перед сохранением
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 26.05.2012 21:10:16

Ладно, что с русскими именами в пути всё туго - я понял. А что делать с с концами строк-то? Как переносить-то?
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение Ism » 26.05.2012 21:42:16

Нужно сохранять через чтото, что не изменяет строку, например
TMemoryStream.SaveToFile
http://www.cyberforum.ru/delphi/thread489537.html
http://forum.vingrad.ru/articles/topic-211911.html

А работать с чистой строкой без символов переноса
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение Mr.Smart » 26.05.2012 22:57:24

veresk
Код: Выделить всё
Memo1.Lines.TextLineBreakStyle:=tlbsCRLF

или tlbsCR или tlbsLF
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 27.05.2012 00:40:57

Не смотря на кажущуюся уместность метода "Memo1.Lines.TextLineBreakStyle:=tlbsCRLF" не сработало!

Код: Выделить всё
procedure TForm1.Button5Click(Sender: TObject);
begin
  Memo4.Lines.TextLineBreakStyle := tlbsCR;
  If Save1.Execute = true then Memo4.Lines.SaveToFile(UTF8Tosys(Save1.FileName));
end;


Код: Выделить всё
procedure TForm1.Button6Click(Sender: TObject);
begin
  Memo4.Lines.TextLineBreakStyle := tlbsCR;
  If Open1.Execute = true then Memo4.Lines.LoadFromFile(UTF8Tosys(Open1.FileName));
end;   


И никак :-( События одинаковые: файл, созданный под Виндой читается и в Винде и в Линуксе нормально, а созданный в Линуксе, под Виндой вместо переносов имеет квадратики.

ЗЫ. А русскоязычные пути поборолись, да.
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение Ism » 27.05.2012 00:44:45

Может надо UTF8Toansi
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 27.05.2012 00:47:11

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

Добавлено спустя 29 минут 55 секунд:
Ну вот как-то так получилось. Стыдно, конечно, такое в продакшн будет пускать..

Код: Выделить всё
procedure TForm1.Button7Click(Sender: TObject);
var
  i: integer;
  t: textfile;
begin
  If Save1.Execute = true then
     begin
       AssignFile(t,UTF8Tosys(Save1.FileName));
       ReWrite(t);
       For i:=0 to Memo4.Lines.Count -1 do
        begin
          {$IFDEF UNIX}
          Write (t, UTF8toansi(Memo4.Lines.Strings[i]) + #$0D#$0A);
          {$ENDIF}
          {$IFDEF WINDOWS}
          Write (t, Memo4.Lines.Strings[i] + #$0D#$0A);
          {$ENDIF}
        end;
      closefile(t);
     end;

end;
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение Mr.Smart » 27.05.2012 02:23:35

veresk незнаю, что у вас за версия FPC, но то что я предложил изначально функционировало.
Код: Выделить всё
TStringList.TextLineBreakStyle:=tlbsCRLF
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 27.05.2012 09:23:11

Всё самое-самое свежее, что под Win, что под Lin.
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 28.05.2012 14:59:44

И не работает :-(
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение SSerge » 28.05.2012 15:25:37

Вот потому и не работает, что "самое-самое свежее". :) Не хотите сюрпризов - пользуйтесь официальными стабильными релизами, отстающими на несколько поколений. Впрочем, и в них могут быть сюрпризы.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Сохранение строк с переносами кроссплатформенно.

Сообщение veresk » 28.05.2012 15:34:09

Дык и есть официальный стабильный релиз. Не dev же собирать!

apt-cache policy lazarus
lazarus:
Установлен: 0.9.30.4-1

Всё по-честному. Указывал при загрузке формы Memo1.Lines.TextLineBreakStyle := tlbsCRLF; и получаю банан, на весь макияж. В Linux работает, файлы из Windows под Linux работают, а вот файлы из Linux под Windows не хотять, вместо переносов - квадратики.

Добавлено спустя 4 минуты 47 секунд:
Mr.Smart писал(а):незнаю, что у вас за версия FPC, но то что я предложил изначально функционировало.


Непонятно тогда, как Вы прописывали TStringList.TextLineBreakStyle? Куда? Так же оно работать не будет, орёт про классы и экземпляры:

unit1.pas(64,33) Error: Only class methods, class properties and class variables can be referred with class references
unit1.pas(64,33) Error: Only class class methods, class properties and class variables can be accessed in class methods


Добавлено спустя 28 минут 23 секунды:
Сделал быстро, просто, но.. МЕГА-костыльно. Выяснил, что ListBox'у пофигу на конец строки, так что.. Да, мне стыдно, мне очень стыдно за это:

Код: Выделить всё
  If Open1.Execute = true then ListBox1.Items.LoadFromFile(UTF8ToSys(Open1.FileName));
  Memo1.Lines := Listbox1.Items;
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru