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

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Неправильно обрабатывается подшаблон получения текущей позиции в строке "()". Такое впечатление, что скопировано из 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: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Shmuel, а смысл? Зачем нужна функция, работающая быстро, но неправильно? От того, что ошибка задокументирована, она не перестаёт быть ошибкой... Лучше бы уж просто убрали поддержку подшаблона "()" - честнее было бы...
Я уж не говорю, что английский язык для меня - иностранный. Совсем.
Last edited by buniak_a_h on Thu 29 Aug, 2019 22:15, edited 1 time in total.
Shmuel
Posts: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Shmuel, спасибо. Раз сторонняя - вопрос снят. А жаль... Придётся самому расчёт позиции организовывать.... :-(
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

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: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

1. buniak_a_h, начиная со следующей ночной (или гитхабовской) сборки, всё, что вы зарепортили, должно работать посимвольно (а не побайтно, как было). Подробнее см. luamacro\changelog.
2. Удалена функция cfind(), вместо неё следует использовать find().
3. Могут появиться новые баги.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

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: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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
Скачайте последнюю ночную сборку, там всё должно быть правильно.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Спасибо. Номер версии не изменился, 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: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

buniak_a_h wrote: Thu 10 Oct, 2019 11:05 В указанной версии была исправлена важная ошибка. Не пора ли "зафиксировать" исправление выпуском стабильной версии?
Эта ошибка существовала 1 (максимум 2) дня. Её не было ни до, ни после. Поэтому к стабильным версиям отношения не имеет.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Shmuel wrote: Thu 10 Oct, 2019 11:19 Эта ошибка существовала
не-не-не! До указанной версии просто неправильно обрабатывались паттерны, содержащие не-ANSI символы. Вы же сами мне писали, что это - ошибка в "сторонней" библиотеке! Ну и добавочка: даже если она и просуществовала пару версий, но она вошла в стабильную сборку! А это - повод пересобрать стабильную.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

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: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

buniak_a_h wrote: Thu 10 Oct, 2019 11:37 Проверил на версии 5400 - там эта ошибка уже была. Вы не о том пишете.
Проверить просто: наберите lua:=('яz'):match".*()$" Правильный ответ - 3. Версии ДО 5459 возвращают 4.
Поверьте, я знаю, о чём пишу.
До замены библиотеки Selene Unicode на Luautf8 это было документированное поведение, а не ошибка.
В библиотеке Selene Unicode возврат смещений в байтах - это фича, а не баг, причём имеющая свои преимущества (как и недостатки).
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

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-ми ночных сборок.
Post Reply

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