Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [wx] Компилятор ругается на русские символы


Автор: Fabio 1.10.2008, 22:36
Здравствуте!

Помогите решить неприятную проблемку.
Я собрал wxWidgets (debug и release) в unicode.
Пока осваиваюсь с библиотекой и до этого все мои исходники были без строк на русском языке.
Теперь вот решил написать заголовок фрейма по русски и на тебе:
Код

converting to execution character set: Illegal byte sequence

Что делать, как быть? У меня мыслей никаких, а русский ой как нужен smile .
Собирать версии библиотеки без unicode не хочется.

Автор: Mazzi 2.10.2008, 08:47
Я думаю тебе нужно сюда http://forum.vingrad.ru/topic-214051.html


Удачи!

Автор: Fabio 2.10.2008, 16:53
Спасибо, но это не совсем то, что у меня (тем более Qt).
Я когда исходный текст пишу, то компилятор спотыкается на строках, где ему встречаются русские
символы и выдаёт ошибку converting to execution character set: Illegal byte sequence
С внешним миром моя программа ни как не связана - всё внутри исходника!
Среда программирования у меня WinXP SP3 + Code::Blocks + MinGW + wxWidgets v2.8.9 unicode.
Пробовал менять кодировку символов в редакторе Code::Blocks, не помогло.
Пробовал перекодировать сам сpp-шник в UTF-8 (может в другую надо было?), не помогло.
Кто сталкивался с этим, откликнитесь.

Автор: Любитель 2.10.2008, 18:25
Что за компилятор, во-первых?

Автор: Fabio 2.10.2008, 18:45
Цитата

Что за компилятор, во-первых?

D:\>gcc --version
gcc (GCC) 3.4.5 (mingw-vista special r3)
Copyright © 2004 Free Software Foundation, Inc.

Порывшись в справке по wxWidgets, решил проблемку сам.
Вместо wxString str(wxT("текст русскими буквами")) нужно писать вот так:
wxString str("русский", wxCSConv(wxT("cp1251")) и переменную str уже можно
использовать в коде, как угодно.
Помоему так - если я не прав, поправвьте.
Спасибо за внимание!

Автор: t_rex 3.10.2008, 13:06
В wxWidgets ВСЕ строковые константы должны быть помещены внутрь макросов wxT() или _()
wxT() - для строк, локализация которых не требуется (например имена файлов)
_() - для строк локализация которых требуется (например лэйбы всякие или мессаги)

Код

wxMessageBox(_("Аццке тексте!!! Уиии!!!"));

Автор: Fabio 3.10.2008, 18:53
То есть, если закладываться на будующее (возможную локализацию своей проги), то писать лучше так:
wxString str( _( "русский" ) , wxCSConv(wxT("cp1251")) ?
Спасибо за дельный совет!

Автор: t_rex 5.10.2008, 21:39
Код

wxString str( _( "русский" ) , wxCSConv(wxT("cp1251")) ?

Не, ну зачем так жестоко, достаточно
Код

wxString str( _( "русский" ));

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

Автор: Fabio 9.10.2008, 20:19
Так в том-то и дело, что если написать без перекодировки, то компилятор останавливается
с выше упомянутой ошибкой на первой-же попавшейся ему строке с НЕ англицкими буквами!
Напомню, мои библиотеки скомпилены с поддержкой UNICODE!
Ясное дело, если перекомпилировать их с опцией UNICODE=0, то со строками будет всё впорядке.
Никак не пойму "физику" процесса взаимодействия GCC и уникодовых библиотек.
На что у него аллергия, блин smile . А так, неспорю, инициализировать каждую строку с перекодировкой -
это жесть.

PS. Есть предчувствие, что мне всётаки придётся перекомпилировать с опцией UNICODE=0

Автор: Любитель 10.10.2008, 11:22
Fabio, ты уверен, что:
Цитата(Fabio @  9.10.2008,  20:19 Найти цитируемый пост)
компилятор останавливается

?

Если это правда, то это абсолютно неважно - с какой версии либ wx ты будешь линковать (юникод или неюникод).

Автор: monax 14.10.2008, 11:04
Проверь кодировку файла. Скорее всего, она не юникодовская. Файл нужно кодировать в юникоде без BOM.

Применительно к Code::Blocks идешь в Settings->Editor->General settings, там меняешь кодировку (Default encoding when opening files) на utf-8. Создаешь новый проект (не уверен, что старый будет автоматически переконвертирован), пишешь русский текст и радуешься жизни.

Автор: Fabio 14.10.2008, 20:01
Спасибо, monax, помогло, и проект новый создавать не пришлось, просто переоткрыл
все файлы в проекте и редактор их автоматом сконвертировал в UTF-8 "без BOM" - не знаю,
что это за BOM, но Notepad++ именно так и показал кодировку)
Цитата

... и радуешься жизни

эт точно smile

Автор: Static 10.11.2008, 11:29
Столкнулся с той же проблемой - Illegal byte sequence при использовании кириллических надписей на контролах (wxButton например)
Изменил кодировку едитора по умолчанию на utf-8 - вроде заработало... но:
если я меняю что-либо на фрейме (похоже, что свойства парента контрола) опять может выскочить ошибка. А может и не выскочить  smile:
Переоткрытие проекта не помогает :(
У кого-нить есть идеи по поводу?

Автор: Static 12.11.2008, 10:06
Разобрался.
Project->Build targets->Compiler->defines: WX_USE_UNICODE
как оно вобще работало  smile ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)