Page 1 of 1
m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Tue May 14, 2019 12:43 pm
by reddeer
Здравствуйте, коллеги.
Столкнулся с такой проблемой. В Windows-10, Visual Studio 2017 никак не удаётся вывести кириллицу в программе. В настройках проекта выбран "Use Unicode Character Set", wxWidgets 3.1.2,
в программе
Code: Select all
wxLocale m_locale;
...
if (!m_locale.Init(wxLANGUAGE_RUSSIAN))
{
wxLogError(_T("This language is not supported by the system."));
return false;
}
отрабатывает без ошибок, т.е.
wxLANGUAGE_RUSSIAN находит и устанавливает, я правильно понимаю?
Уже пробовал и
_T(""), _wxT(""), _(L""), оставлял просто текст. Не помогает, выводит крокозябры.
Подскажите, pls, в какую сторону копать?
PS В Ubuntu 18.04 этот же код работает как надо.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Tue May 14, 2019 2:43 pm
by Kvaz1r
Здравствуйте.
Возможно проблема в кодировке исходных файлов, хотя нужно проверить чтобы wxWidgets была собрана с поддержкой UNICODE.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Tue May 14, 2019 2:44 pm
by ONEEYEMAN
Dobrogo vremeni sutok,
A "internat" primer rabotaet?
I esche - chto znachit - "ne rabotaet"? Ne nahodit fajla s perevodami? Fajl nahodit no ne nahodit perevoda?
Ili ge prosto ne vyvodit stroku zakodirovannuju v programme?
Da, vot esche - biblioteka i proekt sobiralis' s opredelenijami "UNICODE" i "_UNICODE"? Kak v primerah?
Spasibo.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Thu May 16, 2019 9:16 am
by reddeer
Kvaz1r wrote: ↑Tue May 14, 2019 2:43 pm
Здравствуйте.
Возможно проблема в кодировке исходных файлов, хотя нужно проверить чтобы wxWidgets была собрана с поддержкой UNICODE.
В скачанном установшике (Windows Installer) среди прочих был файл, который билдит всю библиотеку: wx_vc15.sln, в настройках которого в Visual Studio 2017 выставлено "Use Unicode Character Set". Т.е. по идее собрано всё с поддержкой Unicode.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Thu May 16, 2019 9:58 am
by reddeer
ONEEYEMAN wrote: ↑Tue May 14, 2019 2:44 pm
Dobrogo vremeni sutok,
A "internat" primer rabotaet?
I esche - chto znachit - "ne rabotaet"? Ne nahodit fajla s perevodami? Fajl nahodit no ne nahodit perevoda?
Ili ge prosto ne vyvodit stroku zakodirovannuju v programme?
Да, пример работает. Но там используются файлы переводов, у меня же прога одноязычная, т.е. я просто в программе использую русские символы. И Ubuntu это позволяет. В Windows нашёл какое-то некрасивое решение: файл сохраняю в ASCII, потом VS перекодирует в UTF, в выводе ставлю L"..." или wxT(".."), тогда выводит корректно.
А хочется как Linux: просто, без макросов что-бы работало.
ONEEYEMAN wrote: ↑Tue May 14, 2019 2:44 pmDa, vot esche - biblioteka i proekt sobiralis' s opredelenijami "UNICODE" i "_UNICODE"? Kak v primerah?
В Windows для Visual Studio сборка библиотеки находится в файле *.sln, в ней - проекты, в настройках каждого из них есть параметр Character Set = "Use Unicode Character Set". Это ведь, надеюсь, то, что надо?
Спасибо, парни, что откликнулись!
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Thu May 16, 2019 10:12 am
by Kvaz1r
Так и Windows позволяет, я в VS без всяких макросов использую кириллицу.
Что еще может быть...посмотрите установлен ли _UNICODE в определениях препроцессора(Проект -> Свойства->Свойства конфигурации -> C/C++ -> Препроцессор).
Если стоит попробовать принудительно сохранить в utf8 с помощью другого редактора и
сказать VS ожидать именно такую кодировку. Если заработает то надо искать глобальные настройки чтобы VS всегда сохраняла в юникод.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Thu May 16, 2019 12:00 pm
by reddeer
Kvaz1r wrote: ↑Thu May 16, 2019 10:12 am
Так и Windows позволяет, я в VS без всяких макросов использую кириллицу.
Что еще может быть...посмотрите установлен ли _UNICODE в определениях препроцессора(Проект -> Свойства->Свойства конфигурации -> C/C++ -> Препроцессор).
Если стоит попробовать принудительно сохранить в utf8 с помощью другого редактора и
сказать VS ожидать именно такую кодировку. Если заработает то надо искать глобальные настройки чтобы VS всегда сохраняла в юникод.
Да, _UNICODE был установлен. Пересобрал библиотеку с ключом /utf-8, в другом редакторе сохранил программку в utf-8, в приложении закомментил:
Code: Select all
#pragma execution_character_set("utf-8")
,
и всё заработало!
Не до конца понимаю, почему пришлось убирать директиву
, не иначе как двойное перекодирование? Но в таком варианте работает. Спасибо!
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Thu May 16, 2019 1:37 pm
by Kvaz1r
reddeer wrote: ↑Thu May 16, 2019 12:00 pm
Не до конца понимаю, почему пришлось убирать директиву
, не иначе как двойное перекодирование? Но в таком варианте работает. Спасибо!
Скорее всего. Ни разу эту директиву раньше не встречал, но
документация говорит, что она уже устаревшая:
This compiler directive is obsolete starting in Visual Studio 2015 Update 2. We recommend that you use the /execution-charset:utf-8 or /utf-8 compiler options together with using the u8 prefix on narrow character and string literals that contain extended characters.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Thu May 16, 2019 2:46 pm
by reddeer
Kvaz1r wrote: ↑Thu May 16, 2019 1:37 pm
reddeer wrote: ↑Thu May 16, 2019 12:00 pm
Не до конца понимаю, почему пришлось убирать директиву
, не иначе как двойное перекодирование? Но в таком варианте работает. Спасибо!
Скорее всего. Ни разу эту директиву раньше не встречал, но
документация говорит, что она уже устаревшая:
This compiler directive is obsolete starting in Visual Studio 2015 Update 2. We recommend that you use the /execution-charset:utf-8 or /utf-8 compiler options together with using the u8 prefix on narrow character and string literals that contain extended characters.
Это было в самом проекте примера minimal (в версии для Windows):
Code: Select all
#ifdef x64
#include <windows.h>
//#pragma execution_character_set("utf-8")
#endif
Для Linux такой проверки нет, хотя там тоже проект 64-битный.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Mon May 31, 2021 2:10 pm
by reddeer
Здравствуйте, коллеги!
Чтобы не плодить тем, спрошу тут.
Есть программа, работающая в Windows 10 и Ubuntu 20.04.
В OnInit устанавливается локаль:
Code: Select all
bool MainApp::OnInit()
{
if (!wxApp::OnInit())
return false;
wxLocale m_locale;
m_locale.Init(wxLANGUAGE_RUSSIAN);
....
}
В отдельном файле mainframe.cpp обрабатывается закрытие программы:
Code: Select all
void MainFrame::OnCloseFrame(wxCloseEvent& event)
{
if (wxMessageBox(("Выйти из программы?"),
_("Вопрос"), wxICON_EXCLAMATION | wxYES_NO) == wxYES) {
Destroy();
}
}
Так вот, вопрос. В Windows всё работает правильно, в Linux не выводит текст на русском, просто пустое место. Если определить локаль ещё раз:
Code: Select all
void MainFrame::OnCloseFrame(wxCloseEvent& event)
{
wxLocale m_locale;
m_locale.Init(wxLANGUAGE_RUSSIAN);
if (wxMessageBox(("Выйти из программы?"),
_("Вопрос"), wxICON_EXCLAMATION | wxYES_NO) == wxYES) {
Destroy();
}
}
вывод корректен. Но это некрасиво как-то. Пробовал m_locale сохранять глобально:
но это не помогает, пока не укажешь в лоб. Никто не сталкивался с такой проблемой?
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Mon May 31, 2021 2:22 pm
by ONEEYEMAN
Доброго времени суток,
А версия Ubuntu русская или английская?
Если английская - какие локали стоят?
Спасибо.
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Mon May 31, 2021 2:31 pm
by reddeer
ONEEYEMAN wrote: ↑Mon May 31, 2021 2:22 pm
Доброго времени суток,
А версия Ubuntu русская или английская?
Если английская - какие локали стоят?
Спасибо.
Русская. Ubuntu не рядом, локали по памяти: ru_RU, ru_RU.utf8 и др. Дело в том, что при старте всё корректно, русский есть. Лишь при
Code: Select all
if (wxMessageBox(("Выйти из программы?"),
_("Вопрос"), wxICON_EXCLAMATION | wxYES_NO) == wxYES) {
Destroy();
}
его нет. И надписи на кнопках "Да"/ "Нет" меняются на "Yes"/"No".
Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10
Posted: Mon May 31, 2021 6:28 pm
by reddeer
Проблема была не только в
, но и в других диалогах, например в
.
В общем проблему решил.
Вместо:
Code: Select all
wxLocale m_locale;
m_locale.Init(wxLANGUAGE_RUSSIAN);
Нужно:
Code: Select all
#ifdef _WIN64
wxLocale m_locale;
m_locale.Init(wxLANGUAGE_RUSSIAN);
#else
std::locale::global(std::locale("ru_RU.UTF8"));
#endif
Это устанавливает локаль глобально для всей программы, это работает в Linux. В Windows - штатная установка wxLocale.