Page 1 of 1
wxStyledTextCtrl->FindText и русские символы
Posted: Sat Apr 25, 2020 2:04 pm
by cutecode
Почему wxStyledTextCtrl->FindText ищет русские символы только с флагом wxSTC_FIND_MATCHCASE?
С английскими и цифрами все четко работает, а для русских символов ищет только если совпадает регистр букв.
Поведение одинаковое и на Windows и на Linux.
Может как-то надо локаль установить?
Code: Select all
int flags = 0;
if (m_bWholeWord)
flags |= wxSTC_FIND_WHOLEWORD;
if (m_bMatchCase)
{
flags |= wxSTC_FIND_MATCHCASE;
m_pSTC->SetSearchFlags(wxSTC_FIND_MATCHCASE);
}
else
{
int d = m_pSTC->GetSearchFlags();
d &= ~wxSTC_FIND_MATCHCASE;
m_pSTC->SetSearchFlags(d);
}
.............
int res = m_pSTC->FindText(pos1, pos2, m_szSearchText, flags, &end);
спс
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Apr 26, 2020 8:39 am
by Kvaz1r
Можете показать минимальный воспроизводимый пример?
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Apr 26, 2020 11:46 am
by cutecode
Использовался пример STC из SAMPLES.
Я добавил в FileOpen() - функцию поиска при открытии файла
Code: Select all
void AppFrame::FileOpen (wxString fname)
{
wxFileName w(fname); w.Normalize(); fname = w.GetFullPath();
m_edit->LoadFile (fname);
m_edit->SelectNone();
if(fname.Find(L"stctest.cpp") != -1)
return;
int flags = 0;
int end, pos1, pos2;
int pos = m_edit->GetCurrentPos();
pos1 = pos;
pos2 = m_edit->GetLastPosition();
int res = m_edit->FindText(pos1, pos2, L"перем", flags, &end);
if (res == wxSTC_INVALID_POSITION)
wxMessageBox(L"no перем");
else
wxMessageBox(L"перем found");
res = m_edit->FindText(pos1, pos2, L"Перем", flags, &end);
if (res == wxSTC_INVALID_POSITION)
wxMessageBox(L"no Перем");
else
wxMessageBox(L"Перем found");
}
Если открыть файл с содержимым
то фразу "Перем"находит, а "перем" - НЕТ
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Apr 26, 2020 12:39 pm
by Kvaz1r
Файл в какой кодировке?
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Apr 26, 2020 1:50 pm
by cutecode
UTF-8
ascii вообще ничего не находит
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Apr 26, 2020 8:30 pm
by Kvaz1r
Чудно, похоже на баг.
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Mon Apr 27, 2020 5:27 am
by cutecode
ну, как так жить? (((
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Mon Apr 27, 2020 10:33 pm
by ONEEYEMAN
Dobrogo vremeni sutok,
Dlja proverki poprobujte skompilirovat Scintilla.
Spasibo.
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Tue Apr 28, 2020 6:07 am
by cutecode
при компиляции Scintilla выдает ошибку
Code: Select all
./../src/AutoComplete.cxx:16:23: fatal error: string_view: Нет такого файла или каталога
я нашел файл string_view, в папке /usr/include/c++/6/experimental/string_view
попробовал его подставить, потом посыпались другие ошибки
Походу придется мне пока смериться с этим багом
Спасибо
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Tue May 12, 2020 11:57 am
by cutecode
Только щас заметил.
Оказывается в code::blocks такое же поведение на Линукс.
Русские слова ищет только если совпадает регистр
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Sep 19, 2021 5:52 pm
by Serge_N
Заинтересовался этим "багом"
Собрал тестовое приложение и как я и предполагал, бага нет (по крайней мере на Xubuntu 20.04)
Code: Select all
#include <wx/app.h>
#include <wx/frame.h>
#include <wx/button.h>
#include <wx/stc/stc.h>
#define wxID_BUTTON_1 1000
class MyFrame : public wxFrame
{
wxButton *m_button1;
wxStyledTextCtrl *m_styledTextCtrl;
wxString m_stVal;
public:
MyFrame(wxWindow *parent, int id = wxID_ANY, wxString title = wxT("wxStyledTextCtrl Bug"), wxPoint pos = wxPoint(200,200), wxSize siz = wxSize(600,400) ) : wxFrame(parent, id, title, pos, siz)
{
m_button1 = new wxButton( this, wxID_BUTTON_1, wxT("Button1"), wxPoint(10,10), wxSize(80,35), 0 );
this->Bind( wxEVT_BUTTON, &MyFrame::OnButton1Click, this, wxID_BUTTON_1 );
m_stVal = "Hello Big world!"; //Текст в wxStyledTextCtrl в котором будем искать нужное слово
m_styledTextCtrl = new wxStyledTextCtrl( this, wxID_ANY, wxPoint(0,60), wxSize(580,300), 0, wxEmptyString );
m_styledTextCtrl->SetCodePage(wxSTC_CP_UTF8); //Устанавливаем кодировку Юникод (UTF-8)
m_styledTextCtrl->SetValue(m_stVal);
}
virtual void OnButton1Click( wxCommandEvent& event )
{
wxString findText = "big "; //Искомое слово, которое нужно найти в wxStyledTextCtrl
int docLength = m_styledTextCtrl->GetTextLength(); //Длина всего документа загруженного в wxStyledTextCtrl
int to;
int valPos = m_styledTextCtrl->FindText(0, docLength, findText, wxSTC_FIND_MATCHCASE, &to); //wxSTC_FIND_WHOLEWORD wxSTC_FIND_MATCHCASE
m_styledTextCtrl->Remove(valPos, to); //Удаляем если слово в wxStyledTextCtrl нашлось.
}
~MyFrame(){}
};
class MyApp : public wxApp
{
wxLocale m_local;
public:
virtual bool OnInit()
{
m_local.Init(wxLANGUAGE_RUSSIAN);
MyFrame* frame = new MyFrame(0L);
frame->Show(true);
return true;
}
};
wxIMPLEMENT_APP(MyApp);
FindText работает одинаково и для латиницы и для кирилицы.
Менял флаг wxSTC_FIND_WHOLEWORD и wxSTC_FIND_MATCHCASE всё работает,
искомое слово на латинице находится только если регистр полностью совпадает по регистру,
если не совпадает, то слово не находится.
Re: wxStyledTextCtrl->FindText и русские символы
Posted: Sun Sep 19, 2021 6:04 pm
by Serge_N
Для удобства добавил wxTextCtrl в котором вводим искомое слово
Code: Select all
#include <wx/app.h>
#include <wx/frame.h>
#include <wx/button.h>
#include <wx/stc/stc.h>
#define wxID_BUTTON_1 1000
class MyFrame : public wxFrame
{
wxButton *m_button1;
wxTextCtrl *m_textCtrl;
wxStyledTextCtrl *m_styledTextCtrl;
wxString m_stVal;
public:
MyFrame(wxWindow *parent, int id = wxID_ANY, wxString title = wxT("wxStyledTextCtrl Bug"), wxPoint pos = wxPoint(200,200), wxSize siz = wxSize(600,400) ) : wxFrame(parent, id, title, pos, siz)
{
m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxPoint(10, 10));
m_button1 = new wxButton( this, wxID_BUTTON_1, wxT("Button1"), wxPoint(130,10), wxSize(80,35), 0 );
this->Bind( wxEVT_BUTTON, &MyFrame::OnButton1Click, this, wxID_BUTTON_1 );
m_stVal = "Hello Big world!"; //Текст в wxStyledTextCtrl в котором будем искать нужное слово
m_styledTextCtrl = new wxStyledTextCtrl( this, wxID_ANY, wxPoint(0,60), wxSize(580,300), 0, wxEmptyString );
m_styledTextCtrl->SetCodePage(wxSTC_CP_UTF8); //Устанавливаем кодировку Юникод (UTF-8)
m_styledTextCtrl->SetValue(m_stVal);
}
virtual void OnButton1Click( wxCommandEvent& event )
{
wxString findText = m_textCtrl->GetValue();
if (findText != wxEmptyString)
{
int docLength = m_styledTextCtrl->GetTextLength();
int to;
int valPos = m_styledTextCtrl->FindText(0, docLength, findText, wxSTC_FIND_MATCHCASE, &to);
//wxSTC_FIND_WHOLEWORD wxSTC_FIND_MATCHCASE
m_styledTextCtrl->Remove(valPos, to); //Удаляем если слово в wxStyledTextCtrl нашлось
}
}
~MyFrame(){}
};
class MyApp : public wxApp
{
wxLocale m_local;
public:
virtual bool OnInit()
{
m_local.Init(wxLANGUAGE_RUSSIAN);
MyFrame* frame = new MyFrame(0L);
frame->Show(true);
return true;
}
};
wxIMPLEMENT_APP(MyApp);
Абсолютно одинаково работает и для кирилицы и для латиницы.