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

Здесь обсуждается всё, что касается макросов.
Post Reply
buniak_a_h
Posts: 742
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 71 times
Been thanked: 19 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: 5833
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 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: 742
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 71 times
Been thanked: 19 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: 5833
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 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: 742
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 71 times
Been thanked: 19 times
Contact:

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

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

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

buniak_a_h
Posts: 742
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 71 times
Been thanked: 19 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: 5833
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 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: 742
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 71 times
Been thanked: 19 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: 5833
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 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: 742
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 71 times
Been thanked: 19 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.

Post Reply

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