wxStyledTextCtrl->FindText и русские символы

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 396
Joined: Fri Dec 09, 2016 7:28 am
Contact:

wxStyledTextCtrl->FindText и русские символы

Post 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);
	
спс
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 321
Joined: Tue Jun 07, 2016 1:07 pm

Re: wxStyledTextCtrl->FindText и русские символы

Post by Kvaz1r »

Можете показать минимальный воспроизводимый пример?
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 396
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxStyledTextCtrl->FindText и русские символы

Post 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");

}
Если открыть файл с содержимым

Code: Select all

Перем тест;
то фразу "Перем"находит, а "перем" - НЕТ
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 321
Joined: Tue Jun 07, 2016 1:07 pm

Re: wxStyledTextCtrl->FindText и русские символы

Post by Kvaz1r »

Файл в какой кодировке?
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 396
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxStyledTextCtrl->FindText и русские символы

Post by cutecode »

UTF-8

ascii вообще ничего не находит
Attachments
ascii.txt
(12 Bytes) Downloaded 147 times
stctest.cpp
(28.91 KiB) Downloaded 180 times
utf8.txt
(24 Bytes) Downloaded 162 times
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 321
Joined: Tue Jun 07, 2016 1:07 pm

Re: wxStyledTextCtrl->FindText и русские символы

Post by Kvaz1r »

Чудно, похоже на баг.
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 396
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxStyledTextCtrl->FindText и русские символы

Post by cutecode »

ну, как так жить? (((
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 5376
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxStyledTextCtrl->FindText и русские символы

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Dlja proverki poprobujte skompilirovat Scintilla.

Spasibo.
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 396
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxStyledTextCtrl->FindText и русские символы

Post by cutecode »

при компиляции Scintilla выдает ошибку

Code: Select all

./../src/AutoComplete.cxx:16:23: fatal error: string_view: Нет такого файла или каталога
я нашел файл string_view, в папке /usr/include/c++/6/experimental/string_view
попробовал его подставить, потом посыпались другие ошибки

Походу придется мне пока смериться с этим багом

Спасибо
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 396
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxStyledTextCtrl->FindText и русские символы

Post by cutecode »

Только щас заметил.

Оказывается в code::blocks такое же поведение на Линукс.
Русские слова ищет только если совпадает регистр
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
Serge_N
Knows some wx things
Knows some wx things
Posts: 30
Joined: Thu Apr 13, 2017 1:34 pm

Re: wxStyledTextCtrl->FindText и русские символы

Post 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 всё работает,
искомое слово на латинице находится только если регистр полностью совпадает по регистру,
если не совпадает, то слово не находится.
Serge_N
Knows some wx things
Knows some wx things
Posts: 30
Joined: Thu Apr 13, 2017 1:34 pm

Re: wxStyledTextCtrl->FindText и русские символы

Post 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);
Абсолютно одинаково работает и для кирилицы и для латиницы.
Post Reply