|
Автор | Тема: [РЕШЕНО] Кракозябры в окне ошибок нового Qt Creator и MSVC2015 (Прочитано 21750 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Не понятно? Вот и с Qt Creator‘ом так — о чем он там пишет на «русском» в консоли сборки — черт его знает… :-). Хотя здесь только «половина» его вины, а именно нежелание разработчиков «пофиксить» ситуацию, когда вывод вызываемого в консоли mingw32 идет в кодировке ibm866, а сам Qt Creator работает в кодировке cp1251. Конечно, проблемы нет для англоязычных разработчиков (ну и для тех, у кого «локаль» на ПК установлена в одной из вариации «английской»), но что же делать нам, истинным патриотам своего языка? 🙂
На форумах, посвященных Qt, есть несколько тем с означенной проблемой и парочкой возможных путей решения, основная идея которых это замена конфигурационных файлов самого Qt Creator‘а перед его компиляцией либо уже пропатчивание готового исполняемого файла. Больше всего решений связано с заменой файла jom.exe, ранее пропатченным одним умельцем b-s-a (например, тут можете ознакомиться более подробно). Хотя это, по сути, справедливо для компилятора от Visual Studio, а у нас тут все же mingw32 :-).
Поэтому, если Вам не помогли способы описанные на ресурсах указанных выше, предлагаю ознакомиться и с моим решением данной проблемы… «костыльным» решением … но имеющим право на существование ;-).
Итак, основная идея — заставить командную строку Windows возвращать текст в кодировке cp1251 вместо ibm866. Для этих целей в арсенале самой операционной системы есть такая утилита как chcp.com. Ее использование весьма тривиальное:
chcp номер_кодировки
Т.е. чтобы сменить кодировку командной строки (cmd.exe) на нужную нам cp1251, достаточно набрать команду:
chcp 1251
Одно плохо — изменения затрагивают только тот «экземпляр» шелла, в котором была набрана команда. Каждый новый «экземпляр» будет иметь кодировку «по-умолчанию» т.е. ibm866. И тут на помощь приходит
Чип & Дейл
одна замечательная особенность командной строки Windows — возможность задавать команды «автозапуска» (команды которые будут выполнятся при старте каждого «экземпляра» cmd.exe). Собственно это и решает нашу проблему — командная строка возвращает весь поток в нужной нам кодировке. Где же задать эту команду? А все там же — в реестре Windows.
Ваша задача — найти ветку реестра «HKEY_CURRENT_USERSoftwareMicrosoftCommand Processor» и создать в ней новый Расширяемый строковый параметр (тип «reg_expand_sz») «AutoRun«, которому присвойте значение «chcp 1251 1>nul«. Все. Теперь каждый запуск командной строки Windows будет приводить к выполнению указанной команды «chcp 1251 1>nul» — и нам гарантировано обеспечена нужная кодировка. Правда «кракозябры» уже будут у всех остальных консольных приложений Windows, например, тот же ipconfig — их то вывод так и остался в кодировке ibm866. Можно, конечно, принудительно теперь уже возвращать нужную нам кодировку командой:
chcp 866
но это же «не наш метод» :-). Поэтому предлагаю Вашему вниманию вариант с BAT файлом, где сначала задается нужный нам параметр реестра, затем запускается Qt Creator, а по окончании его работы созданное нами значение реестра «AutoRun» удаляется:
@echo off
reg add "HKCUSoftwareMicrosoftCommand Processor" /v AutoRun /t reg_expand_sz /d "chcp 1251 1>nul" /f
C:Qtqtcreator-2.5.0binqtcreator.exe
reg delete "HKCUSoftwareMicrosoftCommand Processor" /v AutoRun /f
только строчку с запуском Qt Creator не забудьте заменить на свою.
Можно было бы на этом остановится, но, для любителей эстетики, я хотел бы еще предложить «усовершенствовать» вариант такого запуска Qt Creator‘а без навязчивого «черного окна» консоли, «висящего» до окончания работы. И здесь нашим помощником снова становится сама ОС Windows, а точнее Visual Basic Script. Для этого нам будет необходимо создать обычный текстовый файл, при сохранении которого указать расширение «VBS» (и это ОЧЕНЬ важно). Например, у меня это файл — «
runme.vbs
«. А в качестве содержимого указать вот такой код:
set WShell = CreateObject("WScript.shell")
ACode = WShell.Run("cp1251.bat", 0, false)
где, cp1251.bat — имя нашего ранее созданного BAT файла (у Вас оно может быть, конечно же, другим). Ну и самое главное — оба этих файла (BAT и VBS) должны находится в одной директории :-).
Теперь уже точно все, осталось только поменять ярлык для запуска Qt Creator‘а с «
qtcreator.exe
» на созданный нами «
runme.vbs
» и наслаждаться русскими сообщениями от MinGW :-).
И на последок пару замечаний:
1) учтите, что пока работает Qt Creator запущенный таким образом, каждая новая консоль будет иметь кодировку cp1251;
2) будьте внимательны — Ваши средства защиты могут блокировать запуск файла VBS.
Ну, вроде бы, ничего не забыл — до новых встреч! 😉
p/s знаете более красивый способ решения проблемы? Обязательно напишите в комментарии :-).

Отображение русских символов в Qt
Добрый день, читатель. По умолчанию русские символы в программах с использованием Qt фреймворка отображаются некорректно. Вместо них используются непонятные знаки. Эта проблема появляется при открытии исходников программ, при выводе русских букв в консоль, при выводе русских букв в виджеты (Label, PlainText и т.д.). В этой статье содержатся решения этих проблем. На сайте уже имеется статья, в которой показано решение проблемы отображения русских букв при выводе в консоль на C++.
Русские символы в исходном коде
Бывает возникает проблема с кодировкой при открытии исходных текстов программ в Qt Creator, чаще всего такая проблема возникает у пользователей Windows. Дело в том, что при написании программы исходники иногда сохраняются в одной кодировке, а редактор в Qt Creator открывает по умолчанию в другой кодировке. Из-за этого вместо русских букв появляются кракозябры или знаки вопроса. По умолчанию в настройках редактора кода Qt Creator кодировка файлов устанавливается System, т.е. кодировка операционной системы. Linux чаще всего использует UTF-8, а Windows cp1251.

Проблема с кодировкой в редакторе Qt Creator
Для решения проблемы в верхнем меню Qt Creator следует выбрать Инструменты(Tools) — Параметры…(Settings…). В открывшемся окне слева в списке найти и выбрать Текстовый редактор(Text Editor), далее выбираем вкладку Поведение(Behavior). Находим группу настроек Кодировки файлов(Encoding files) и выбираем кодировку по умолчанию(default) — UTF-8. Теперь редактор будет открывать исходники в UTF-8, исходные тексты программ чаще всего пишутся именно в этой кодировке.
После настройки редактора следует перекодировать сами исходники. Это можно сделать в Notepad++, если вы пользователь Windows.
Можно открывать файлы и в других кодировках, для этого в верхнем меню следует выбрать Правка — Выбрать кодировку, а далее найти кодировку, в которой был сохранен исходник программы.
В итоге редактор будет сохранять исходники в новых проектах в UTF-8 и корректно открывать их после.
Помещая русские символы в поле Text в виджете Label или в другие виджеты, можно также столкнуться с проблемой отображения русских букв. В редакторе форм русские символы в виджеты устанавливаются и отображаются нормально, а вот при установки программным путем — нет.
Поместим русские символы в виджет Label и в PushButton в редакторе форм.

Русские символы в редакторе форм Qt
Как видно, они отображаются корректно. Далее скомпилируем и запустим программу.

Отображение русских символов в виджетах
Отображение символов корректно. Теперь в изменим текст в виджетах программным путем, для этого в редакторе кода в файле mainwindow.cpp в конструктор добавим пару строк:
ui->label->setText("Русские символы");
ui->pushButton->setText("И здесь");
А затем скомпилируем и запустим программу.

Проблемы с отображением русских символов
Как видно, проблема имеет место быть, но решить ее очень легко.
Для этого устанавливаем текст с помощью функции trUtf8().
ui->label->setText(trUtf8("Русские символы"));
ui->pushButton->setText(trUtf8("И здесь"));
Скомпилируем и запустим программу.

Корректное отображение с trUtf8()
Проблема решена, но если таких выводов в программе много, то вставка текста через функцию нерациональна с точки зрения времени. Можно решить проблему не прибегая к функции trUtf8(), для этого нужно лишь задать кодеки в программе. В файле main.cpp подключаем заголовок QTextCodec.
#include <QTextCodec>
В начало функции main.cpp добавляем следующие строчки:
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
Устанавливаем текст в виджетах в файле mainwindow.cpp без функции trUtf8()
ui->label->setText("Русские символы");
ui->pushButton->setText("И здесь");
Компилируем и запускаем.

Корректное отображение русских символов с установленным кодеком
Отображение символов корректно, теперь не нужно прибегать к функции trUtf8(). Проблема решена.
Кстати, в последних версиях Qt такой проблемы с кодировкой у меня не наблюдалось.
Для примера был создан стандартный проект Qt Widgets. Поэтому после решения проблем с кодировкой файл main.cpp содержит следующий код
#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Вывод русских символов в консоль с Qt
Если русские символы в консоль выводятся некорректно через qDebug(), то решение для этого такое же, как и решение с отображением русских символов в виджетах Qt.
А если Вы пишете без Qt и у вас проблемы русскими символами при выводе в консоль, то почитайте статью, там есть решение — Русские символы(буквы) при вводе/выводе в консоль на C++.
Надеюсь, что статья Вам чем-то помогла.
Спасибо за внимание.






