converting to execution character set: Illegal byte sequence

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
san4es
In need of some credit
In need of some credit
Posts: 4
Joined: Mon Mar 30, 2009 4:59 am

converting to execution character set: Illegal byte sequence

Post by san4es » Mon Mar 30, 2009 5:10 am

Добрый день!

Я начинаю осваивать wxWidgets. И сразу столкнулся с ошибкой, связанной с выводом сообщений на русском языке.

wxMessageBox(wxT("Ошибка!"));

На такие вот строчки компилятор и ругается. Посмотрел в сети, предлагали лечить при помощи

-finput-charset=windows-1251

Однако и на это тоже я получаю ошибку:

cc1plus.exe: internal compiler error: Aborted

Я так понимаю, что вопрос не совсем связан с wxWidgets, однако помогите новичку :) Как всё-таки справляться с русским текстом?
OS: WinXP, compiler: GCC 3.4.5, wxWidgets 2.8.10

van_user
Experienced Solver
Experienced Solver
Posts: 55
Joined: Wed Jun 11, 2008 9:28 pm
Location: UA

Re: converting to execution character set: Illegal byte sequ

Post by van_user » Mon Mar 30, 2009 7:24 am

san4es wrote:И сразу столкнулся с ошибкой, связанной с выводом сообщений на русском языке.

wxMessageBox(wxT("Ошибка!"));

На такие вот строчки компилятор и ругается.
Будет лучше если ты еще выложишь лог компилятора. У меня диалоги с русскими буквами нормально работают без специальных параметров в configure.
И исходник у тебя, судя по всему, небольшой - выложи и его.
Win XP (SP0), mingw, wx 2.9.0

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Mon Mar 30, 2009 7:26 am

Среда разработки какая? Надеюсь у тебя файл исходник в кодировке UTF-8?

san4es
In need of some credit
In need of some credit
Posts: 4
Joined: Mon Mar 30, 2009 4:59 am

Re: converting to execution character set: Illegal byte sequ

Post by san4es » Mon Mar 30, 2009 4:43 pm

IDE - CodeBlocks

Код такой:

Code: Select all

    if(wxFile::Exists(wxT("MGI.xml")))
    {
        mgi_bib_db = new XMLBiblioDB(wxT("MGI.xml"));
        bDBLoaded = true;
    }else
    {
        wxMessageBox(wxT("Ошибка! Отсутствует файл базы данных!"));
        bDBLoaded = false;
    }
Build log:

Code: Select all

-------------- Build: Release in wxBiblio ---------------

Compiling: wxBiblioMain.cpp
C:\backup\Programming\wxBiblio\wxBiblioMain.cpp:97:1: converting to execution character set: Illegal byte sequence
C:\backup\Programming\wxBiblio\wxBiblioMain.cpp:134:1: converting to execution character set: Illegal byte sequence
Process terminated with status 1 (0 minutes, 7 seconds)
2 errors, 0 warnings
OS: WinXP, compiler: GCC 3.4.5, wxWidgets 2.8.10

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Tue Mar 31, 2009 4:31 am

А по второму вопросу - если стоит wxUSE_UNICODE в дефинесах. Все исходники должны быть в UTF-8 а не в win1251

Как собиралось wxWidgets с ключом Unicode=1?

san4es
In need of some credit
In need of some credit
Posts: 4
Joined: Mon Mar 30, 2009 4:59 am

Post by san4es » Tue Mar 31, 2009 5:23 am

borr_1 wrote:А по второму вопросу - если стоит wxUSE_UNICODE в дефинесах. Все исходники должны быть в UTF-8 а не в win1251

Как собиралось wxWidgets с ключом Unicode=1?
Да, собирал с Unicode=1, для проекта в CodeBlocks тоже указал Unicode. А насчёт исходников - значит ли это, что надо конвертнуть исходник в UTF-8 для надёжности, поскольку я его редактировал и наверное внёс win1251?
OS: WinXP, compiler: GCC 3.4.5, wxWidgets 2.8.10

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Tue Mar 31, 2009 8:03 am

В CodeBlocks смотри в меню Edit->File Encoding

san4es
In need of some credit
In need of some credit
Posts: 4
Joined: Mon Mar 30, 2009 4:59 am

Post by san4es » Tue Mar 31, 2009 12:30 pm

borr_1 wrote:В CodeBlocks смотри в меню Edit->File Encoding
Спасибо, помогло!
OS: WinXP, compiler: GCC 3.4.5, wxWidgets 2.8.10

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Post by SmileGobo » Thu Apr 02, 2009 4:50 pm

Немного не в тему вопрос. Как с длинной строк кириллических символов обстоит дело? у меня не юникодная сборка и на некоторые строки у меня Length() выдает ноль.
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya » Fri Apr 03, 2009 8:52 am

SmileGobo wrote:Как с длинной строк кириллических символов обстоит дело? у меня не юникодная сборка и на некоторые строки у меня Length() выдает ноль.
Значит эти строки пустые

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Post by SmileGobo » Fri Apr 03, 2009 7:25 pm

В том то и дело что нет. Это так странно ведет себя строка после использования Trim().
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya » Fri Apr 03, 2009 11:40 pm

SmileGobo wrote:В том то и дело что нет. Это так странно ведет себя строка после использования Trim().
Тогда пример в студию! :)

И исходники функции есть же, можно в отладке посмотреть.

Code: Select all

// some compilers (VC++ 6.0 not to name them) return true for a call to
// isspace('\xEA') in the C locale which seems to be broken to me, but we have
// to live with this by checking that the character is a 7 bit one - even if 
// this may fail to detect some spaces (I don't know if Unicode doesn't have
// space-like symbols somewhere except in the first 128 chars), it is arguably
// still better than trimming away accented letters
inline int wxSafeIsspace(wxChar ch) { return (ch < 127) && wxIsspace(ch); }

// trims spaces (in the sense of isspace) from left or right side
wxString& wxString::Trim(bool bFromRight)
{
    // first check if we're going to modify the string at all
    if ( !empty() &&
         (
          (bFromRight && wxSafeIsspace(GetChar(length() - 1))) ||
          (!bFromRight && wxSafeIsspace(GetChar(0u)))
         )
       )
    {
        if ( bFromRight )
        {
            // find last non-space character
            reverse_iterator psz = rbegin();
            while ( (psz != rend()) && wxSafeIsspace(*psz) )
                psz++;

            // truncate at trailing space start
            erase(psz.base(), end());
        }
        else
        {
            // find first non-space character
            iterator psz = begin();
            while ( (psz != end()) && wxSafeIsspace(*psz) )
                psz++;

            // fix up data and length
            erase(begin(), psz);
        }
    }

    return *this;
}
Может быть wxSafeIsspace считает эти символы пробельными, а может быть эти символы изначально были пробельными. Отладка покажет. Если нет, то желательно воспроизвести эту проблему на примере minimal, что идет в составе библиотеки.

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Sat Apr 04, 2009 5:27 am

И исходники функции есть же, можно в отладке посмотреть.
С этого места поподробнее. Если я имею gdb отладчик и wxWidgets уже скомпилированную как динамическая библ. Как я могу в ней что-то отладить?

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya » Sat Apr 04, 2009 12:42 pm

borr_1 wrote:Если я имею gdb отладчик и wxWidgets уже скомпилированную как динамическая библ. Как я могу в ней что-то отладить?
Я gdb не использовал, но насколько я знаю он позволяет загружать отладочную информацию. А вот в случае будет ли он работать в отладке динамических библиотек ничего не скажу.

Если не получится отладить, то можно скопировать исходники в приложение и там проверить.

Post Reply