Page 1 of 1

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

Posted: Fri Mar 15, 2019 3:23 pm
by SAlG
Здравствуйте.
Знакомлюсь с 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 ?

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

Posted: Mon Mar 18, 2019 2:54 pm
by ONEEYEMAN
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.

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

Posted: Mon Mar 18, 2019 3:37 pm
by amk_tt
Можно сказать, что причина однозначно в несовпадении кодировки.

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

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

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

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

Posted: Mon Mar 18, 2019 3:43 pm
by ONEEYEMAN
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.

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

Posted: Tue Mar 19, 2019 12:49 pm
by cutecode
1. сохрани cpp файл через notpad.exe в формате ascii
2. затем в формате UTF8
3 в настройках codeblocks "Encoding settings" укажи UTF8

и будет тебе счастье

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

Posted: Tue Mar 19, 2019 12:55 pm
by Serge_N
По первому вопросу.
Нужно добавить к конструктор, а еще лучше в инициализатор wxApp::OnInit()

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

Code: Select all

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

Code: Select all

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

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

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

Posted: Fri Mar 22, 2019 6:14 pm
by SAlG
Спасибо за ответы.
За неделю идеальный вариант не появился, с локалями я уже экспериментировал, результата не было, потому не стал описывать.
Сделал по надёжному:
1. В "wx_pch.h" задал

Code: Select all

#define _8(s) wxString::FromUTF8Unchecked(s) 
Соответственно в модулях использую префикс "_8("
2. поправил wxSmith:
а) в wxSmith settings добавил чекбокс "Всегда использовать FromUTF8Unchecked",
б) в модуле формирования текста добавил проверку настройки и если выбрана, пишу

Code: Select all

wxString::FromUTF8Unchecked(
Вопрос считаю закрытым.