Поиск в строке с кириллицей

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

Здравствуйте!
Извините, если этот вопрос уже обсуждался; не представляю, как сформулировать поисковый запрос...
Столкнулся с проблемой:
lua:=string.find('sergey</first-name>', '<')
возвращает 7 - правильно. А при наличии в строке русских букв:
lua:=string.find('Сергей</first-name>', '<')
результат получаем 13 (в исходной строке на 13-м месте стоит "t"). Понятно, что дело в кодировке UTF-8. Но как написать поисковое выражение, чтоб результат от кодировки не зависел?
P/S. Замена string на regex, unicode.utf8 (и остальные в unicode), а также использование mf.index и конструкции вида ('Сергей</first-name>'):find('<') ситуации не спасают
Я, кажется, нашёл решение:
lua:=unicode.utf8.cfind('Сергей</first-name>', '<')
Так - работает, но как-то сложно... Может, есть более простой способ?
Last edited by buniak_a_h on Tue 13 Mar, 2018 02:04, edited 4 times in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Поиск в строке с кириллицей

Post by Shmuel »

Из мануала LuaFAR (статья "Unicode support"):

Calling functions on strings with colon syntax
LuaFAR modifies the __index field of the strings metatable to point to unicode.utf8 table of Selene Unicode library, rather than to string table.
That means ("abc"):match("b") is equivalent to unicode.utf8.match("abc", "b") rather than to string.match("abc", "b").
Operator # is not affected by this change.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

Shmuel, спасибо. Видимо, тот самый "простой" способ, о котором я спрашивал, выглядит так:
('Сергей</first-name>'):cfind('<')
Т.е. просто надо вместо find использовать cfind
Увы, в том писании языка, что есть у меня, не написано, что функция string.find возвращает номера байтов, а не символов. Просто «find возвращает индексы <...>, т.е. начало и конец вхождения». И! Даже функция unicode.utf8.find ТОЖЕ возвращает номера байтов !!! Функцию cfind нашёл совершенно случайно, просматривая таблицу unicode.utf8 .
Last edited by buniak_a_h on Tue 13 Mar, 2018 10:13, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Поиск в строке с кириллицей

Post by Shmuel »

buniak_a_h wrote: Tue 13 Mar, 2018 10:07Функцию cfind нашёл совершенно случайно
Эта функция описана в мануале macroapi_manual.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

buniak_a_h wrote: Tue 13 Mar, 2018 10:07Функцию cfind нашёл совершенно случайно, просматривая таблицу unicode.utf8
И, кстати, чуть-чуть пропиарю макрос поиска в chm-файлах:
Если бы его не было, я мог бы искать описание unicode.utf8.cfind всю жизнь. Кто бы мог подумать, что описание unicode.utf8 - в документе luafar_manual.chm, а описание функции unicode.utf8.cfind - в документе macroapi_manual.ru.chm в разделе "разное"?!!
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Поиск в строке с кириллицей

Post by Shmuel »

buniak_a_h wrote: Tue 13 Mar, 2018 10:24то бы мог подумать, что описание unicode.utf8 - в документе luafar_manual.chm, а описание функции unicode.utf8.cfind - в документе macroapi_manual.ru.chm в разделе "разное"?!!
И что же там разного? Функцию cfind предоставляет плагин LuaMacro, LuaFAR её не содержит. Поэтому в мануале LuaFAR она не описана.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

Shmuel wrote: Tue 13 Mar, 2018 10:43И что же там разного?
Это вопрос не ко мне, а к составителям мануала. Они поместили описание этой функции в раздел "разное". Т.е. просто просмотром оглавления её НЕ НАЙТИ !
Вообще, чтоб начать ей использовать, нужно:
(а) знать, что она есть (макрос tableview.lua в помощь)
(б) знать, в каком документе она описана (либо мой Active-Help, либо arcview и поиск в помощь).
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

Админ! Вопрос решён, тему можно закрыть. Отдельное спасибо Shmuel за участие.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Поиск в строке с кириллицей

Post by Shmuel »

buniak_a_h wrote: Tue 13 Mar, 2018 10:53Это вопрос не ко мне, а к составителям мануала.
Составитель - это я. Потратил на эти мануалы огромное количество часов. Простым просмотром оглавления много чего можно не найти.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Поиск в строке с кириллицей

Post by John Doe »

buniak_a_h wrote: Tue 13 Mar, 2018 10:53Т.е. просто просмотром оглавления её НЕ НАЙТИ !
В оглавлении же есть.
И кроме того, что есть поиск в chm, бывает полезно и на форуме поискать.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

Shmuel wrote: Tue 13 Mar, 2018 11:00Составитель - это я
Извините... Я абсолютно уверен, что работа там бешеная. Уважаю.
НО!
Тогда "чего же там разного"? Наверно, логичнее было бы ссылку на эту функцию поместить не в раздел "Разное", а в раздел "Работа с UTF-8", либо "обработка строк"... Ну хоть как-то к теме...
Впрочем, советы давать любой горазд. Советское прошлое так и прэ...
John Doe wrote: Tue 13 Mar, 2018 11:06В оглавлении же есть
Увы, в оглавлении "Разное". Это - всё, что угодно.
John Doe wrote: Tue 13 Mar, 2018 11:06есть поиск в chm
Ну да. Но в поставке 4 (ну, 3 без учёта перевода) chm-а, а поиска по всем - нету. И логику распределения статей по chm-ам я так и не понял. Мне пытались объяснить типа far с маленькой буквы - там, а Far с большой - там. Тут - не работает.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Поиск в строке с кириллицей

Post by John Doe »

buniak_a_h wrote: Tue 13 Mar, 2018 10:07Увы, в том писании языка, что есть у меня, не написано, что функция string.find возвращает номера байтов, а не символов. Просто «find возвращает индексы <...>, т.е. начало и конец вхождения». И! Даже функция unicode.utf8.find ТОЖЕ возвращает номера байтов !!!
Документация по unicode находится в luafar_manual.chm, и там это указано:

О функции cfind там не говорится, поскольку в LuaFAR её нет (библиотека Selene Unicode не предоставляет).

А в luamacro было решено её всё же добавить, именно потому и описана она именно в macroapi_manual.
Раздел Разное потому что более подходящего нет.
Да, создать отдельный раздел по работе со строками (хотя бы просто ссылающийся на luafar_manual) было бы неплохо, но..
buniak_a_h wrote: Tue 13 Mar, 2018 11:12И логику распределения статей по chm-ам я так и не понял. Мне пытались объяснить типа far с маленькой буквы - там, а Far с большой - там.
Вероятно вы не понимаете разницу между LuaFAR и luamacro.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

John Doe wrote: Tue 13 Mar, 2018 12:43Вероятно вы не понимаете разницу между LuaFAR и luamacro.
Это - да. Более того! Я даже не понимаю, как можно узнать, что есть в одном и что - в другом, не имея исходников того и другого.
И ещё более того! Мне, как "писателю макросов", по большому счёту на...плевать, в какой части FAR-а реализована та или иная функция. Меня интересует (а) как её найти (дерево таблиц; причем - всех: os, win, far, Far и т.д.) и (б) какие параметры требуется передать и что ожидать на выходе. Называется «интерфейс».
Отдельно писателям плагинов (а я уверяю, что таковых намного меньше, чем писателей макросов) был бы интересен АПИ с доступными функциями FAR-а.
Всё остальное интересно писателям самого FAR-а ...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Поиск в строке с кириллицей

Post by John Doe »

buniak_a_h wrote: Tue 13 Mar, 2018 12:53по большому счёту на...плевать, в какой части FAR-а реализована та или иная функция.
Не вникая ищете в мануалах, и найдёте.
Но если вникнуть, то искать будет проще.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Поиск в строке с кириллицей

Post by buniak_a_h »

John Doe wrote: Tue 13 Mar, 2018 12:57если вникнуть
Если б это была моя основная работа - я бы так к ней и относился. Но я - просто пользователь ФАРа (как один пишет, ФАР - не нянька, а инструмент). Который для сокращения СВОЕЙ работы иногда пишет макросы (для себя!), и, если мне покажется, что макрос может быть полезен ещё кому-то - делюсь. А доскональное изучение мануалов и структуры самого ФАРа никак не вяжется с понятием "сокращения работы".
Ну и ответ на Ваш же упрёк, что есть поиск по форуму.
John Doe wrote: Tue 13 Mar, 2018 11:06бывает полезно и на форуме поискать
В первом посте я написал, что не смог сформулировать поисковый запрос так, чтоб получить приемлемый ответ. Если тупо вбить "поиск в строке с кириллицей" - получите ответ на 90 страницах. Если тоже самое через "+" - ничего не найдёте. Вы правда думали, что я не попытался?
Post Reply

Return to “Нужна помощь”