Page 1 of 1

converting to execution character set: Illegal byte sequence

Posted: Mon Mar 30, 2009 5:10 am
by san4es
Добрый день!

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

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

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

-finput-charset=windows-1251

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

cc1plus.exe: internal compiler error: Aborted

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

Re: converting to execution character set: Illegal byte sequ

Posted: Mon Mar 30, 2009 7:24 am
by van_user
san4es wrote:И сразу столкнулся с ошибкой, связанной с выводом сообщений на русском языке.

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

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

Posted: Mon Mar 30, 2009 7:26 am
by borr_1
Среда разработки какая? Надеюсь у тебя файл исходник в кодировке UTF-8?

Re: converting to execution character set: Illegal byte sequ

Posted: Mon Mar 30, 2009 4:43 pm
by san4es
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

Posted: Tue Mar 31, 2009 4:31 am
by borr_1
А по второму вопросу - если стоит wxUSE_UNICODE в дефинесах. Все исходники должны быть в UTF-8 а не в win1251

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

Posted: Tue Mar 31, 2009 5:23 am
by san4es
borr_1 wrote:А по второму вопросу - если стоит wxUSE_UNICODE в дефинесах. Все исходники должны быть в UTF-8 а не в win1251

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

Posted: Tue Mar 31, 2009 8:03 am
by borr_1
В CodeBlocks смотри в меню Edit->File Encoding

Posted: Tue Mar 31, 2009 12:30 pm
by san4es
borr_1 wrote:В CodeBlocks смотри в меню Edit->File Encoding
Спасибо, помогло!

Posted: Thu Apr 02, 2009 4:50 pm
by SmileGobo
Немного не в тему вопрос. Как с длинной строк кириллических символов обстоит дело? у меня не юникодная сборка и на некоторые строки у меня Length() выдает ноль.

Posted: Fri Apr 03, 2009 8:52 am
by Kolya
SmileGobo wrote:Как с длинной строк кириллических символов обстоит дело? у меня не юникодная сборка и на некоторые строки у меня Length() выдает ноль.
Значит эти строки пустые

Posted: Fri Apr 03, 2009 7:25 pm
by SmileGobo
В том то и дело что нет. Это так странно ведет себя строка после использования Trim().

Posted: Fri Apr 03, 2009 11:40 pm
by Kolya
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, что идет в составе библиотеки.

Posted: Sat Apr 04, 2009 5:27 am
by borr_1
И исходники функции есть же, можно в отладке посмотреть.
С этого места поподробнее. Если я имею gdb отладчик и wxWidgets уже скомпилированную как динамическая библ. Как я могу в ней что-то отладить?

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

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