Ошибка в функции Instr при регистронезависимом поиске

Автор sokol92, 22 января 2021, 20:59

0 Пользователи и 1 гость просматривают эту тему.

sokol92

Сообщил о баге.

Sub TestInstrFunction()
  MsgBox Instr(1, "Ш", "ш", 1)
End Sub


Возвращает 0 вместо 1. Для латинских букв все нормально.
Владимир.

economist

Корнями проблема, кмк, уходит в Windows в системные функции преобразования регистра.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Владимир.

economist

Дело, думаю, не в юникоде, а в том что все не ASCII-ENG символы (т.е. все русские буквы в т.ч.) - функция Windows tolower() оставляет нетронутыми. Проблема также хорошо известна в SQLite, где есть три варианта решения.

В LO Basic решение - приводить к одному регистру, благо тут это работает т.к. реализовано по-своему:

Sub TestInstrFunction()
 MsgBox Instr(1, UСase("Ш"), UСase("ш"), 1)
End Sub

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

 Баг опубликован, и тот, кто его исправит, вряд ли нуждается в наших подсказках. :)

MS Windows не при чем. Баг есть и в Linux, например. Причина - в использовании функции toAsciiUpperCase, которая "знает" только латынь. Если говорить только о Basic, то кроме упомянутой InStr этой же болезнью заражены InStrRev и StrConv (этой функции нет в документации, но она реализована). Об этих багах я напишу после выхода версии 7.1. 
Владимир.

eeigor

#5
Оффтоп
Не пробовал, кто знает навскидку (если знает):
если объекту TextSearch Options присвоить значение SearchOptions, установив свойства локали Language и Country соответственно равными "ru" и – не знаю как задать РФ, то
такие регулярные выражения, как "\b", "\w" будут работать с кириллицей или нет? Как здесь?
Проще: регулярки "\b", "\w" видят национальный язык?
Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community

sokol92

Владимир.