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

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

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

Post 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 ?
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

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

Post 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.
amk_tt
Earned a small fee
Earned a small fee
Posts: 19
Joined: Sat Nov 28, 2009 4:45 pm
Location: Russia

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

Post by amk_tt »

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

Строго говоря, компилятор, когда компилирует текст программы, не всегда знает, в какой кодировке программа написана. Поэтому, для надёжности, надо бы писать все русские буквы в форме \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: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

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

Post 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.
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Post by cutecode »

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

и будет тебе счастье
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
Serge_N
Knows some wx things
Knows some wx things
Posts: 40
Joined: Thu Apr 13, 2017 1:34 pm

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

Post by Serge_N »

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

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

Code: Select all

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

Code: Select all

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

Мне под Linux помогло. Под Windows должно тоже помочь.
SAlG
In need of some credit
In need of some credit
Posts: 2
Joined: Fri Mar 15, 2019 10:12 am

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

Post 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(
Вопрос считаю закрытым.
Post Reply