Ошибка в unicode.utf-8.match ?

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

Ошибка в unicode.utf-8.match ?

Post by buniak_a_h » Thu 29 Aug, 2019 21:44

Неправильно обрабатывается подшаблон получения текущей позиции в строке "()". Такое впечатление, что скопировано из string без учёта двухбайтовых символов.
Как воспроизвести:
lua:=string.match('ab', '.*b()') (== string.len('ab')+1)
lua:=('ab'):match('.*b()') (== ('ab'):len()+1)
lua:=unicode.utf8.match('ab', '.*b()') (==unicode.utf8.len('ab')+1)
все три выражения возвращают 3, что правильно. Теперь заменим однобайтовый символ на двухбайтовый:
lua:=string.match('яb', '.*()b') (== string.len('яb')+1 - неправильно, но ожидаемо)
lua:=('яb'):match('.*()b') (~= ('яb'):len()+1 !!! Ошибка!!!)
lua:=unicode.utf8.match('яb', '.*()b') (~=unicode.utf8.len('яb')+1 Явная ошибка!!!)
Все три возвращают 4. Ну, string.match - понятно, там и string.len() работает неправильно (байты считает). Но вот два последних выражения, судя по тому, что len() работает верно, должны возвращать тоже двойку. Позиция в строке не должна зависеть от количества байт на символ. Ну или другими словами, если len() отрабатывает такую ситуацию правильно, то и match должна работать так же.
Может, я чего-то не понимаю в логике работы функций из unicode.utf8? Тогда объясните мне, почему результат одной функции (len) не совпадает с результатом другой (match).
Last edited by buniak_a_h on Thu 29 Aug, 2019 21:53, edited 1 time in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

Ошибка в unicode.utf-8.match ?

Post by Shmuel » Thu 29 Aug, 2019 21:57

LuaFAR manual wrote:**NOTE:**

* `find` positions are in bytes for all ctypes!
* use `ascii.sub` to cut found ranges! This is a) faster, b) more reliable

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

Ошибка в unicode.utf-8.match ?

Post by buniak_a_h » Thu 29 Aug, 2019 22:13

Shmuel, а смысл? Зачем нужна функция, работающая быстро, но неправильно? От того, что ошибка задокументирована, она не перестаёт быть ошибкой... Лучше бы уж просто убрали поддержку подшаблона "()" - честнее было бы...
Я уж не говорю, что английский язык для меня - иностранный. Совсем.
Last edited by buniak_a_h on Thu 29 Aug, 2019 22:15, edited 1 time in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

Ошибка в unicode.utf-8.match ?

Post by Shmuel » Thu 29 Aug, 2019 22:24

buniak_a_h wrote:
Thu 29 Aug, 2019 22:13
От того, что ошибка задокументирована, она не перестаёт быть ошибкой
Библиотека unicode - сторонняя библиотека, документация, приведенная в мануале LuaFAR, - это её родная документация.
В коде есть мои изменения, но это в основном багфиксы.
Документация описывает поведение функций библиотеки. Если кому-то библиотека не нравится, может поискать другую, они существуют. Далеко за примером ходить не надо, одна из них (regex) встроена в LuaFAR.
Last edited by Shmuel on Thu 29 Aug, 2019 22:26, edited 1 time in total.

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

Ошибка в unicode.utf-8.match ?

Post by buniak_a_h » Thu 29 Aug, 2019 22:45

Shmuel, спасибо. Раз сторонняя - вопрос снят. А жаль... Придётся самому расчёт позиции организовывать.... :-(

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

Ошибка в unicode.utf-8.match ?

Post by buniak_a_h » Fri 30 Aug, 2019 00:47

Shmuel wrote:
Thu 29 Aug, 2019 22:24
Далеко за примером ходить не надо, одна из них (regex) встроена в LuaFAR.
1. Насколько я понял, regex - Perl-овские регэкспы. А там нет шаблона ()
2. Напоролся на ещё одну ошибку в "сторонних" библиотеках:
Есть строка вида йцу ╔═ Поиск ═╗ кен
разборка по шаблону %b╔╗ не работает. Видимо, дело в том, что первый символ шаблона (после %b) - двухбайтовый.
из описания языка:
%bxy, здесь x и y - два различных символа. Такой элемент соответствует строкам, которые начинаются с x, заканчиваются на y, и в них сбалансированы x и y. Это означает, что, если читать строку слева направо, подсчитывая +1 для x и -1 для y, то последний y является первым y, для которого счетчик равен 0. Например, элемент %b() соответствует выражениям со сбалансированными круглыми скобками.
Авторы сторонних библиотек нахалтурили... Я опять не дочитал документацию?
Last edited by buniak_a_h on Fri 30 Aug, 2019 00:51, edited 2 times in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

Ошибка в unicode.utf-8.match ?

Post by Shmuel » Fri 30 Aug, 2019 13:12

1. buniak_a_h, начиная со следующей ночной (или гитхабовской) сборки, всё, что вы зарепортили, должно работать посимвольно (а не побайтно, как было). Подробнее см. luamacro\changelog.
2. Удалена функция cfind(), вместо неё следует использовать find().
3. Могут появиться новые баги.

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

Ошибка в unicode.utf-8.match ?

Post by buniak_a_h » Sun 01 Sep, 2019 10:28

Shmuel, я,наверно, не всю необходимую информацию предоставил.
FAR 3.0.5459 x64
lua:=('яz'):match".*()$" => 4
Кстати! Far 3.0.5459 x86
lua:=('яz'):match".*()$" => 3
Ну вот это - точно что-то странное!
По поводу lua:=(' йцу ╔═ Поиск ═╗ кен '):match"%b╔╗":
ситуация аналогичная: в 32-разрядной версии работает, в той же (по номеру) 64-разрядной - нет.
Last edited by buniak_a_h on Sun 01 Sep, 2019 10:33, edited 1 time in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

Ошибка в unicode.utf-8.match ?

Post by Shmuel » Sun 01 Sep, 2019 10:35

buniak_a_h wrote:
Sun 01 Sep, 2019 10:28
FAR 3.0.5459 x64
lua:=('яz'):match".*()$" => 4
Кстати! Far 3.0.5459 x86
lua:=('яz'):match".*()$" => 3
Скачайте последнюю ночную сборку, там всё должно быть правильно.

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

Ошибка в unicode.utf-8.match ?

Post by buniak_a_h » Sun 01 Sep, 2019 10:51

Спасибо. Номер версии не изменился, update обновления не видит. Пришлось вручную...
 ! Message from: John Doe
Продолжение: viewtopic.php?p=154967#p154967
Last edited by John Doe on Wed 04 Sep, 2019 14:19, edited 1 time in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

ClickToTitleDir — переход к папкам по щелчку на заголовке панели (и др.)

Post by Shmuel » Thu 10 Oct, 2019 11:19

buniak_a_h wrote:
Thu 10 Oct, 2019 11:05
В указанной версии была исправлена важная ошибка. Не пора ли "зафиксировать" исправление выпуском стабильной версии?
Эта ошибка существовала 1 (максимум 2) дня. Её не было ни до, ни после. Поэтому к стабильным версиям отношения не имеет.

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

ClickToTitleDir — переход к папкам по щелчку на заголовке панели (и др.)

Post by buniak_a_h » Thu 10 Oct, 2019 11:30

Shmuel wrote:
Thu 10 Oct, 2019 11:19
Эта ошибка существовала
не-не-не! До указанной версии просто неправильно обрабатывались паттерны, содержащие не-ANSI символы. Вы же сами мне писали, что это - ошибка в "сторонней" библиотеке! Ну и добавочка: даже если она и просуществовала пару версий, но она вошла в стабильную сборку! А это - повод пересобрать стабильную.

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

ClickToTitleDir — переход к папкам по щелчку на заголовке панели (и др.)

Post by buniak_a_h » Thu 10 Oct, 2019 11:37

Shmuel, вдогонку.
Проверил на версии 5400 - там эта ошибка уже была. Вы не о том пишете.
Проверить просто: наберите lua:=('яz'):match".*()$" Правильный ответ - 3. Версии ДО 5459 возвращают 4.
Ну и более показательный пример (доказывающий, что это - именно ошибка, а не особенность):
lua:=('яz'):match".*()$" == ('яя'):match".*()$"
Как Вы понимаете, результат должен быть одинаковый
Last edited by buniak_a_h on Thu 10 Oct, 2019 11:48, edited 1 time in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

ClickToTitleDir — переход к папкам по щелчку на заголовке панели (и др.)

Post by Shmuel » Thu 10 Oct, 2019 11:47

buniak_a_h wrote:
Thu 10 Oct, 2019 11:37
Проверил на версии 5400 - там эта ошибка уже была. Вы не о том пишете.
Проверить просто: наберите lua:=('яz'):match".*()$" Правильный ответ - 3. Версии ДО 5459 возвращают 4.
Поверьте, я знаю, о чём пишу.
До замены библиотеки Selene Unicode на Luautf8 это было документированное поведение, а не ошибка.
В библиотеке Selene Unicode возврат смещений в байтах - это фича, а не баг, причём имеющая свои преимущества (как и недостатки).

buniak_a_h
Posts: 897
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 77 times
Been thanked: 28 times
Contact:

ClickToTitleDir — переход к папкам по щелчку на заголовке панели (и др.)

Post by buniak_a_h » Thu 10 Oct, 2019 11:52

Shmuel wrote:
Thu 10 Oct, 2019 11:47
Поверьте, я знаю, о чём пишу.
Я там добавил доказательство, что это - именно баг.
buniak_a_h wrote:
Thu 10 Oct, 2019 11:37
lua:=('яz'):match".*()$" == ('яя'):match".*()$"
Как Вы понимаете, результат определения позиции никак не может зависеть от конкретных символов, если их количество не изменилось. И писал, что проверил на версии 5400, а это значит, что ошибка просуществовала не 1-2 дня, и не менее 48-ми ночных сборок.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

ClickToTitleDir — переход к папкам по щелчку на заголовке панели (и др.)

Post by Shmuel » Thu 10 Oct, 2019 12:05

buniak_a_h wrote:
Thu 10 Oct, 2019 11:52
Как Вы понимаете, результат определения позиции никак не может зависеть от конкретных символов, если их количество не изменилось.
Если позиция выражена в байтах, а не в символах, то она как раз зависит от конкретных символов, что и показывает ваш пример. А выражение позиций в байтах, как уже сказано выше, есть документированная фича библиотеки Selene Unicode.

Post Reply

Return to “Обсуждение макросов”