Lazarus 1.6, обсудим изменения...

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

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

Re: Lazarus 1.6, обсудим изменения...

Сообщение resident » 20.02.2016 14:47:49

Ok )
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus 1.6, обсудим изменения...

Сообщение Лекс Айрин » 20.02.2016 15:14:36

resident писал(а):Похоже то что нужно, благодарствую.


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

Re: Lazarus 1.6, обсудим изменения...

Сообщение McLion » 20.02.2016 18:54:01

С этим юникодом замучили уже... нельзя это как то раз и навсегда решить да и все? А то переписывай каждый раз все подряд. :|
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Lazarus 1.6, обсудим изменения...

Сообщение Mirage » 20.02.2016 23:16:33

resident писал(а):Из xml читаются размеры книги, текстовое значение узла в основном похоже на 100х200, а также может быть 100х200/5.
Кроме этого в узле иногда попадается хлам - пробелы, запятые или вобще буквы.
"х" может быть и мелкая и большая и наша и латиница.
Что делаю я:
StringReplace-ом преобразую любые "х" к мелкой латинской.
Посимвольно читаю строку и если текущий символ от "0" до "9" или латинская "х", "Х" или наша "х", "Х" или "/", то он мне подходит и я его беру для заполнения чистой строки для парсинга.
Что-то типа такого (OfferBinding - строка с хламом):
Код: Выделить всё
          Str := '';
          OfferBinding := StringReplace(OfferBinding, 'х', 'x', [rfReplaceAll, rfIgnoreCase]);
          OfferBinding := StringReplace(OfferBinding, 'Х', 'x', [rfReplaceAll, rfIgnoreCase]);
          OfferBinding := StringReplace(OfferBinding, 'X', 'x', [rfReplaceAll, rfIgnoreCase]);
          for i := 0 to High(OfferBinding) do
            if (OfferBinding[i] in ['0'..'9']) or (OfferBinding[i] in ['x', '/']) then Str := Str + OfferBinding[i];


А можно вместо этой порнографии задействовать простенькие регулярные выражения.
Типа такого:
Код: Выделить всё
([\dхХX/]+)+

Которое найдет все разрешенные символы в строке. Затем найденные группы объединить и парсить уже отфильтрованную строку.
Используя такое выражение:
Код: Выделить всё
(\d+)[хХX](\d+)/(\d+)

Можно получить уже размеры в виде чисел.
В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.
А вот писателям библиотек нужно. Но те, как правило, знают где лежат грабли. И как быстро обработать строку.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Lazarus 1.6, обсудим изменения...

Сообщение pupsik » 21.02.2016 00:56:23

Mirage А регулярки стали работать быстрее "заточенной" функции?
Я не приветствую решение resident но...

п.с.
В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.
Плин... они для юзверя писать должны, а не для ... И должны рассчитывать на большие объёмы инфы, а не десяток строчек...
п.с.п.с.
Хотя: чем быстрее, тем быстрее лаве капнет. Капитализм, однако. :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lazarus 1.6, обсудим изменения...

Сообщение resident » 21.02.2016 11:20:04

pupsik писал(а):convertEncoding(StringReplace('эЭяЯюЮ', 'я', 'ы', [rfReplaceAll, rfIgnoreCase]), guessEncoding(s), encodingAnsi);

Ужос. Кстати, нашел функцию UTF8StringReplace :)

Добавлено спустя 7 минут 59 секунд:
Mirage писал(а):В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.

Ok, уже избавился от него.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus 1.6, обсудим изменения...

Сообщение Mirage » 21.02.2016 14:01:51

pupsik писал(а):А регулярки стали работать быстрее "заточенной" функции?


Хорошие реализации регулярных выражений работают весьма быстро. Хотя теоретически, специализированную функцию можно заточить так, что она будет быстрее регулярок.
Однако, как показывает в т.ч. данный пример, чаще всего регулярки быстрее сделанных "в лоб" функций. Собсно потому они обычно и используются для обработки текста.
Есть ли хорошие реализации RegExp для FPC? Не знаю какова идущая из коробки.
Но вот эта, думаю, будет хороша:
https://github.com/BeRo1985/flre
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Lazarus 1.6, обсудим изменения...

Сообщение resident » 21.02.2016 15:03:27

Mirage писал(а):Но вот эта, думаю, будет хороша

internettools стал её использовать
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus 1.6, обсудим изменения...

Сообщение pupsik » 21.02.2016 19:45:08

Хорошие реализации регулярных выражений работают весьма быстро.
неужели?.... :mrgreen:

Есть ли хорошие реализации RegExp для FPC
... Если не использовать не латиницу - море... И почему мы используем эту не латиницу?

п.с.
Что быстрее разобрать: автомобиль, или колесо?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lazarus 1.6, обсудим изменения...

Сообщение Mirage » 22.02.2016 00:16:48

pupsik писал(а):Если не использовать не латиницу - море...


Реализация от BeRo декларирует поддержку уникода, так что проблем с кириллицей должно быть не больше обычного.

По остальному - если есть что сказать, то лучше конкретно, намеки слабо понятны.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Lazarus 1.6, обсудим изменения...

Сообщение pupsik » 22.02.2016 01:37:42

намеки слабо понятны
аналогичное мнение.
Просто весьма странно мнение что регулярка работает быстрее нежели "заточенный" алгоритм. Вот по скорости разработки и не влезания в исходники регулярки подходят. А по скорости... Ну..у коли вы этому верите, пущай будет так.

Реализация от BeRo декларирует поддержку уникода,
А в лазаре synedit с кирилицей работает... Ну..у через кхм..м... но..о работает. :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lazarus 1.6, обсудим изменения...

Сообщение sign » 22.02.2016 07:38:24

resident писал(а):
Лекс Айрин писал(а):вообще-то, есть функция UTF8Pos...

Похоже то что нужно, благодарствую. Я несколько страниц пытался узнать эту тайну. :mrgreen:
Может где есть сводка: что теперь можно, а что нельзя?

Если это все работает, то тогда действительно тот чемодан без ручки можно выкинуть. Но возникает вопрос: а что если после выкидывания тех функций переименовать эти, чтоб были без префикса "UTF8"? И все были бы довольны, и код бы читался лучше, да и писать меньше?

з.ы. Почему пишут, что функция устарела? Я еще испробовать не успел, а она уже устарела. :) А что теперь в тренде?
Deprecated, see #LazUtils.LazUTF8 for replacements.

http://lazarus-ccr.sourceforge.net/docs ... f8pos.html

Замечательно работает функция Pos(), просто нужно понимать, что она делает.
Она находит символы в строке. И без разницы, какова кодировка и что там сколько байт занимает, если в искомой строке и искомая подстрока - "одного поля ягоды", т.е., одной кодировки.

Пример из моей программы:
Код: Выделить всё
function FindProductAll(V: TVirtualStringTree; P: PVirtualNode; T: TStringList): PVirtualNode;
var i, l, k: Integer;
    Data: PPrice;
begin
  if not Assigned(P) then P := V.RootNode^.FirstChild
  else P := V.GetNextNoInit(P);
  Result := nil;
  k := T.Count;
  while Assigned(P) do begin
    Data := V.GetNodeData(P);
    if Data^.IsShow then begin;
      l := 0;
      for i := 0 to k-1 do begin
        if Pos(T[i], UTF8UpperCase(Data^.Name)) <= 0 then Break;
        Inc(l);
      end;
      if l = k then Exit(P)
    end;
    P  := V.GetNextNoInit(P);
  end;
end;     
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Lazarus 1.6, обсудим изменения...

Сообщение woodhead » 22.02.2016 08:27:52

ogorodov писал(а):В этой версии перестала работать функция UTF8ToSys() ... при сборке под винду ... или это только у меня так

Да, есть такое дело. Я так понял, что надо использовать lazutf8. Но вот как именно использовать, не доходит. Буду признателен за объяснение или ссылку на мануал.
woodhead
новенький
 
Сообщения: 21
Зарегистрирован: 24.12.2014 12:23:20

Re: Lazarus 1.6, обсудим изменения...

Сообщение McLion » 22.02.2016 12:30:18

Может так?
Код: Выделить всё
LazUTF8.UTF8ToSys()
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Lazarus 1.6, обсудим изменения...

Сообщение resident » 22.02.2016 12:32:33

sign писал(а):Замечательно работает функция Pos(), просто нужно понимать, что она делает.
Она находит символы в строке. И без разницы, какова кодировка и что там сколько байт занимает, если в искомой строке и искомая подстрока - "одного поля ягоды", т.е., одной кодировки.

Панты

woodhead писал(а):Я так понял, что надо использовать lazutf8. Но вот как именно использовать, не доходит. Буду признателен за объяснение или ссылку на мануал.

http://wiki.freepascal.org/LCL_Unicode_Support/ru
Там внизу секция "RTL с кодовой страницей UTF-8 по умолчанию"
Начиная с FPC 2.7.1 кодовая страница, используемая RTL по умолчанию, может быть изменена на UTF-8 (CP_UTF8)

1) Т.е. в 2.7.1 можно уже можно включить UTF RTL, а вот в 3.0.0 уже включено по умолчанию
В файле LazUTF8 функция, к примеру, UTF8ToSys - является пустышкой, т.к. уже включена опция UTF8_RTL
Код: Выделить всё
AnsiToUTF8, UTF8ToAnsi, SysToUTF8, UTF8ToAnsi не действуют. Они использовались преимущественно для вышеуказанных функций, которые больше не требуют преобразований аргументов и результата.
Многочисленные явные вызовы UTF8Encode и UTF8Decode больше не нужны, поскольку при присваивании строки в UnicodeString строке String и наоборот компилятор сделает это автоматически.

2) Компилятор автоматически перекодирует при присваивании.
Кстати, это объясняет мой вопрос, оставшийся без ответа (Там case не видит содержание переменной Ansistring, и заработал если только эту переменную тупо присвоить другой или если делать конвертацию AnsiToUTF8. Т.е. что конвертация, что присваивание - результат один и тотже):
viewtopic.php?f=5&t=10934#p93494
viewtopic.php?f=5&t=10934#p93502
Что происходит, когда я ввел промежуточную переменную типа string, и case заработал? Конвертация по Лазарусовски?

Да, похоже теперь для конвертации нужно простое присваивание переменной.

з.ы. Можно готовится уже к версии 1.7 (там их уже почикают) и отключить сейчас WrapperFunctions. В файл FileUtil добавить строку перед собственно самими функциями, и они отключатся.
Код: Выделить всё
{$DEFINE DisableWrapperFunctions}

А вот чего дальше и не знаю, можно конечно подключить файл LazUTF8, но там же функции пустышки.
(Файловые функции теперь в файле LazFileUtils.)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: sunjob и гости: 55

Рейтинг@Mail.ru