Code::Blocks + wxSmith и русские буквы Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
SAlG
In need of some credit
In need of some credit
Posts: 1
Joined: Fri Mar 15, 2019 10:12 am

Code::Blocks + wxSmith и русские буквы

Post by SAlG » Fri Mar 15, 2019 3:23 pm

Здравствуйте.
Знакомлюсь с wxWidgets-3.1.2.
ОС Windows XP Pro SP3 Rus.
Code::Blocks 17.12 с MinGW, все настройки по умолчанию.
Собрал, работает, но когда в wxSmith меню, кнопки и текст в wxTextCtrl написал русскими буквами, при этом в дизайнере нормально, а в запущенной программе отобразились рунические иероглифы.
Поискав ответы, придумал следующие варианты решения:
1. Code::Blocks создаёт все файлы по умолчанию в UTF-8, а wxWidgets, думаю, ожидает в Windows (Вопрос, только в Windows? и в любой Windows ?) кодовую страницу Windows-1251. Перекодировал testMain.cpp в 1251 - получил русские буквы.
2. Решение 1 плохое, при миграции в Linux, думаю, опять придётся перекодировать. да и Юникод в тексте теряется.
Вариант 2: Можно в настройках редактора 'wxSmith settings' отключить "Use I18N for string" и выбрать _Т("") или wxT(""). Тогда при кодовой странице UTF-8 получаю русские буквы.
Это тоже не нравится, то есть надо отключить интернационализацию чтобы получить русские буквы?
Вариант 3.
В файле wx_pch.h добавил

Code: Select all

#ifdef _(s)
#undef _(s)
#endif // _
#define _(s) wxString::FromUTF8(s)
тогда при UTF-8 и включенной I18N всё нормально отображается. Но получаю Warning и решение не очень нравится.
Вариант 4.
Подстановка вручную префикса "L" чтобы получилось _(L"Кнопка"), - тоже даёт русские буквы, но это безсмысленно, wxSmith при обновлении заменит как было.
5. Сборка библиотеки "wxWidgets" с ключом "wxUSE_UNICODE_UTF8 1" и указание дополнительно в приложении "#define wxUSE_UNICODE_WCHAR 0" ситуацию никак не изменило. Русские буквы только в указанных выше случаях.
Вопрос, как решить данную проблему более красиво? "Си" никогда не изучал, и править "wxSmith" чтобы он сразу подставлял, например, "wxString::FromUTF8(s)" сейчас не готов.

Вопрос 2.
Хочу сделать кросс платформенное приложение с использованием SQLite.
В SQLite родной формат UTF-8, поэтому мне предпочтительней чтобы и БД, и ядро wxWidgets, и приложение всё было в UTF-8. То есть мне важна скорость взаимодействия программы и БД, а то что при отображении для пользователя в Windows возможны перекодировки, не важно.
В описании встречал предупреждение что в Windows UTF-8 может не работать, но по мне так всё работает.
Вопрос в том на что надо обращать внимание при использовании ключа wxUSE_UNICODE_UTF8 ?

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3062
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Code::Blocks + wxSmith и русские буквы

Post by ONEEYEMAN » Mon Mar 18, 2019 2:54 pm

Dobrogo vremeni sutok,
Na 1 vopros otveta net.
No dlja zarjadki - kak sobiralas biblioteka? Kakaja komanda ispolzovalas'?

A na 2 - poprobujte posmotret' na wxSQLite.

Spasibo.

amk_tt
Earned a small fee
Earned a small fee
Posts: 18
Joined: Sat Nov 28, 2009 4:45 pm
Location: Russia

Re: Code::Blocks + wxSmith и русские буквы

Post by amk_tt » Mon Mar 18, 2019 3:37 pm

Можно сказать, что причина однозначно в несовпадении кодировки.

Строго говоря, компилятор, когда компилирует текст программы, не всегда знает, в какой кодировке программа написана. Поэтому, для надёжности, надо бы писать все русские буквы в форме \u04xx.
Следующая проблема: литерал "текст" может содержать текст только в 8-битном представлении, поэтому русские буквы в UNICODE туда просто не влезают (впрочем автор топика об этом писал).

Замечание по поводу интернализации: использование русских букв в строках и так как бы не предусматривает использования интернализации, так как обычно в таком случае надписи делаются по-английски, а перевод текста на нужный язык и согласование множественного числа берёт на себя библиотека i18n (у меня, правда, до сих пор не получалось сгенерировать файл перевода.

Программу лучше писать с использованием UNICODE-строк, преобразуя их из UTF-8 и обратно. Это занимает немного времени при чтении/записи, зато избавляет от головной боли и экономит гораздо больше времени при обработке.
Проблемы с UNICODE в Windows возникают, когда используются коды выше \uFFFF. Это из-за того, что Windows фактически использует не UNICODE, а UCS-2 (или м.б. UTF-16). При использовании GCC это не важно, он внутри использует полноценный UNICODE.

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3062
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Code::Blocks + wxSmith и русские буквы

Post by ONEEYEMAN » Mon Mar 18, 2019 3:43 pm

Dobrogo vremeni sutok,
K sogaleniju ne znaju ili budet rabotat, no:

Code: Select all

#ifdef WIN32
#include <windows.h>
#pragma execution_character_set("utf-8")
#endif
pod MSVS rabotaet normalno.

Spasibo.

P.S.: A voobsche to da - programmu luchshe pisat po anglijski, a stroki peredavat v _(), chto oboznachit ih dlja perevoda.

User avatar
cutecode
Filthy Rich wx Solver
Filthy Rich wx Solver
Posts: 211
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: Code::Blocks + wxSmith и русские буквы

Post by cutecode » Tue Mar 19, 2019 12:49 pm

1. сохрани cpp файл через notpad.exe в формате ascii
2. затем в формате UTF8
3 в настройках codeblocks "Encoding settings" укажи UTF8

и будет тебе счастье
regards,
Alexander Saprykin
www.wxwidgets.ru

Serge_N
Earned a small fee
Earned a small fee
Posts: 14
Joined: Thu Apr 13, 2017 1:34 pm

Re: Code::Blocks + wxSmith и русские буквы

Post by Serge_N » Tue Mar 19, 2019 12:55 pm

По первому вопросу.
Нужно добавить к конструктор, а еще лучше в инициализатор wxApp::OnInit()

В заголовочном файле:

Code: Select all

wxLocale m_locale;
В файле реализации:

Code: Select all

m_locale.Init(wxLANGUAGE_RUSSIAN);
По второму вопросу, как уже сказал выше ONEEYEMAN, лучше всего использовать wxSQLite3

Мне под Linux помогло. Под Windows должно тоже помочь.

Post Reply