Lazarus 1.6, обсудим изменения...
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
resident писал(а):Похоже то что нужно, благодарствую.
Пожалуйста.
С этим юникодом замучили уже... нельзя это как то раз и навсегда решить да и все? А то переписывай каждый раз все подряд. 
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
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 А регулярки стали работать быстрее "заточенной" функции?
Я не приветствую решение resident но...
п.с.
п.с.п.с.
Хотя: чем быстрее, тем быстрее лаве капнет. Капитализм, однако.
Я не приветствую решение resident но...
п.с.
Плин... они для юзверя писать должны, а не для ... И должны рассчитывать на большие объёмы инфы, а не десяток строчек...В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.
п.с.п.с.
Хотя: чем быстрее, тем быстрее лаве капнет. Капитализм, однако.
pupsik писал(а):convertEncoding(StringReplace('эЭяЯюЮ', 'я', 'ы', [rfReplaceAll, rfIgnoreCase]), guessEncoding(s), encodingAnsi);
Ужос. Кстати, нашел функцию UTF8StringReplace
Добавлено спустя 7 минут 59 секунд:
Mirage писал(а):В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.
Ok, уже избавился от него.
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
pupsik писал(а):А регулярки стали работать быстрее "заточенной" функции?
Хорошие реализации регулярных выражений работают весьма быстро. Хотя теоретически, специализированную функцию можно заточить так, что она будет быстрее регулярок.
Однако, как показывает в т.ч. данный пример, чаще всего регулярки быстрее сделанных "в лоб" функций. Собсно потому они обычно и используются для обработки текста.
Есть ли хорошие реализации RegExp для FPC? Не знаю какова идущая из коробки.
Но вот эта, думаю, будет хороша:
https://github.com/BeRo1985/flre
Mirage писал(а):Но вот эта, думаю, будет хороша
internettools стал её использовать
неужели?....Хорошие реализации регулярных выражений работают весьма быстро.
... Если не использовать не латиницу - море... И почему мы используем эту не латиницу?Есть ли хорошие реализации RegExp для FPC
п.с.
Что быстрее разобрать: автомобиль, или колесо?
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
pupsik писал(а):Если не использовать не латиницу - море...
Реализация от BeRo декларирует поддержку уникода, так что проблем с кириллицей должно быть не больше обычного.
По остальному - если есть что сказать, то лучше конкретно, намеки слабо понятны.
аналогичное мнение.намеки слабо понятны
Просто весьма странно мнение что регулярка работает быстрее нежели "заточенный" алгоритм. Вот по скорости разработки и не влезания в исходники регулярки подходят. А по скорости... Ну..у коли вы этому верите, пущай будет так.
А в лазаре synedit с кирилицей работает... Ну..у через кхм..м... но..о работает.Реализация от BeRo декларирует поддержку уникода,
resident писал(а):Лекс Айрин писал(а):вообще-то, есть функция UTF8Pos...
Похоже то что нужно, благодарствую. Я несколько страниц пытался узнать эту тайну.![]()
Может где есть сводка: что теперь можно, а что нельзя?
Если это все работает, то тогда действительно тот чемодан без ручки можно выкинуть. Но возникает вопрос: а что если после выкидывания тех функций переименовать эти, чтоб были без префикса "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;
ogorodov писал(а):В этой версии перестала работать функция UTF8ToSys() ... при сборке под винду ... или это только у меня так
Да, есть такое дело. Я так понял, что надо использовать lazutf8. Но вот как именно использовать, не доходит. Буду признателен за объяснение или ссылку на мануал.
Может так?
Код: Выделить всё
LazUTF8.UTF8ToSys()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.)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
