Permalink
Browse files

Версия 1.44.34 - MyTetra научилась работать с директориями, в путях к…

…оторых есть национальные символы

В Windows русскоязычные строки стали правильно отображаться в консоли
Работает, как минимум, в Windows на CP 1251 + CP 866 и в Linux на UTF-8
  • Loading branch information...
xintrea committed Sep 23, 2018
1 parent 2a2d014 commit 42fa04f754a30c3c0adff02d27d0bfd0b6d05df3
Showing with 21 additions and 24 deletions.
  1. +1 −1 app/app.pro
  2. +9 −3 app/src/libraries/GlobalParameters.cpp
  3. +7 −10 app/src/main.cpp
  4. +1 −1 app/src/main.h
  5. +3 −9 app/src/views/consoleEmulator/ExecuteCommand.cpp
View
@@ -10,7 +10,7 @@ BUILD_TYPE="release"
# Enable console for Windows
# 0 - disable, 1 - enable (this is for compile mytetra.exe and rename to mytetra_debug.exe)
WINDOWS_CONSOLE_ENABLE=0
WINDOWS_CONSOLE_ENABLE=1
# Profiling enable
# 0 - disable, 1 - enable
@@ -56,7 +56,12 @@ void GlobalParameters::init(void)
pointStatusBar=NULL;
windowSwitcher=NULL;
initCodepage();
initCodepage(); // устанавливаются кодеки локали и кодеки консоли
// После установки кодеков можно показать имя бинарника, и оно должно отобразиться правильно
// даже если пути есть каталог с национальными символами
qDebug() << "Set main program file to " << mainProgramFile;
initWorkDirectory(); // Инициализация рабочей директории
}
@@ -68,7 +73,7 @@ QString GlobalParameters::getInitSystemCodepage()
#endif
#ifdef Q_OS_LINUX
return "UTF-8");
return "UTF-8";
#endif
return "";
@@ -82,7 +87,7 @@ QString GlobalParameters::getInitConsoleCodepage()
#endif
#ifdef Q_OS_LINUX
return "UTF-8");
return "UTF-8";
#endif
return "";
@@ -311,6 +316,7 @@ bool GlobalParameters::findWorkDirectory(void)
// Директория, где была выполнена команда запуска
QFileInfo mainProgramFileInfo(mainProgramFile);
QString fullCurrentPath=mainProgramFileInfo.absolutePath();
qDebug() << "Check full current path " << fullCurrentPath;
if(isMytetraIniConfig(fullCurrentPath+"/conf.ini")==true)
View
@@ -788,8 +788,10 @@ int main(int argc, char ** argv)
// Запоминается имя файла запущенного бинарника
// Файл запущенной программы (нулевой аргумент функции main)
QString mainProgramFile=QString::fromLatin1( argv[0] ); // todo: Этот код наверно некорректно работает с путями в UTF8
qDebug() << "Set main program file to " << mainProgramFile;
// Метод fromLocal8Bit корректно работает для 8-ми битных кодировок локали (Win) и для UTF-8 (Lin)
// даже если в имени файла встречаются национальные символы
// а кодек еще не установлен
QString mainProgramFile=QString::fromLocal8Bit( argv[0] ); // Данные запоминаются в сыром виде и никак не интерпретируются до использования
globalParameters.setMainProgramFile(mainProgramFile);
// Перехват отладочных сообщений
@@ -801,22 +803,17 @@ int main(int argc, char ** argv)
// Обработка консольных опций
parseConsoleOption(app);
#if QT_VERSION >= 0x050000 && QT_VERSION < 0x060000
// Установка увеличенного разрешения для дисплеев с большим DPI (Retina)
if( qApp->devicePixelRatio() > 1.0 )
qApp->setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
#if QT_VERSION < 0x050000
// Установка кодека текстов
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
#endif
// Инициализация глобальных параметров,
// внутри происходит установка рабочей директории
// внутри происходит установка рабочей директории, настройка кодеков для локали и консоли
globalParameters.init();
// Инициализация основных конфигурирующих программу переменных
// Инициализация основных конфигурирующих программу переменных
mytetraConfig.init();
// Инициализация переменных, отвечающих за хранилище данных
View
@@ -34,7 +34,7 @@ using namespace std;
// Версия программы
#define APPLICATION_RELEASE_VERSION 1
#define APPLICATION_RELEASE_SUBVERSION 44
#define APPLICATION_RELEASE_MICROVERSION 32
#define APPLICATION_RELEASE_MICROVERSION 34
// Поддерживаемая версия формата базы (хранилища)
@@ -9,8 +9,10 @@
#include "ConsoleEmulator.h"
#include "main.h"
#include "libraries/ActionLogger.h"
#include "libraries/GlobalParameters.h"
extern ActionLogger actionLogger;
extern GlobalParameters globalParameters;
ExecuteCommand::ExecuteCommand(QObject *parent) : QObject(parent)
@@ -41,16 +43,8 @@ ExecuteCommand::ExecuteCommand(QObject *parent) : QObject(parent)
}
// Выясняется кодировка локали
QTextCodec *localeCodec = QTextCodec::codecForLocale();
QString localeCodepage=localeCodec->name(); // Возможные варианты "windows-1251" для Windows
// Для Windows с русской кодировкой исправляется кодировка локали, так как в консли локаль CP866
if(localeCodepage=="windows-1251")
localeCodepage="CP866";
// Определяется кодек для вывода текста терминального потока
outputCodec = QTextCodec::codecForName(localeCodepage.toLocal8Bit());
outputCodec = QTextCodec::codecForName(globalParameters.getConsoleCodepage().toLatin1());
}

0 comments on commit 42fa04f

Please sign in to comment.