Одно из возможных решений – скрыть для компилятора cl.exe файлы со строками языка ОС. В данном случае речь о локале ru-ru
с идентификатором LCID
, равным 1049
. Полный список идентификаторов можно посмотреть здесь, стоит учесть, что там они указаны в шестнадцатеричном виде.
В зависимости от версии и разрядности компилятора, выбранного для Qt-проекта, расположение файла cl.exe может разниться. Например, для MSVC2015 64bit путь будет такой:
{Коренная папка Visual Studio}VCbinamd64
В MSVC2017 структура пути несколько иная:
{Коренная папка Visual Studio}VCToolsMSVC{версия}binHostx86x64
Имя конечной папки можно подсмотреть в настройках сборки проекта в QtCreator:
Для MSVC2017 x86_amd64
, представленная на рисунке, будет как раз соответствовать Hostx86x64
(завершающая часть пути).
По этому пути достаточно переименовать папку «1049», например, добавив подчёркивание «1049_», после чего выполнить пересборку проекта. Сообщения компилятора будут выведены на английском языке:
warning C4311: 'type cast': pointer truncation from 'Qt::HANDLE' to 'unsigned int' warning C4302: 'type cast': truncation from 'Qt::HANDLE' to 'unsigned int'
Стоит заметить, что наличие папки с английским языком, т.е. «1033», является необходимым для неанглоязычной ОС. Доустановить или удалить вовсе некоторые языки можно в установщике Visual Studio:
Автор | Тема: [РЕШЕНО] Кракозябры в окне ошибок нового Qt Creator и MSVC2015 (Прочитано 22660 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Одно из возможных решений – скрыть для компилятора cl.exe файлы со строками языка ОС. В данном случае речь о локале ru-ru
с идентификатором LCID
, равным 1049
. Полный список идентификаторов можно посмотреть здесь, стоит учесть, что там они указаны в шестнадцатеричном виде.
В зависимости от версии и разрядности компилятора, выбранного для Qt-проекта, расположение файла cl.exe может разниться. Например, для MSVC2015 64bit путь будет такой:
{Коренная папка Visual Studio}VCbinamd64
В MSVC2017 структура пути несколько иная:
{Коренная папка Visual Studio}VCToolsMSVC{версия}binHostx86x64
Имя конечной папки можно подсмотреть в настройках сборки проекта в QtCreator:
Для MSVC2017 x86_amd64
, представленная на рисунке, будет как раз соответствовать Hostx86x64
(завершающая часть пути).
По этому пути достаточно переименовать папку «1049», например, добавив подчёркивание «1049_», после чего выполнить пересборку проекта. Сообщения компилятора будут выведены на английском языке:
warning C4311: 'type cast': pointer truncation from 'Qt::HANDLE' to 'unsigned int' warning C4302: 'type cast': truncation from 'Qt::HANDLE' to 'unsigned int'
Стоит заметить, что наличие папки с английским языком, т.е. «1033», является необходимым для неанглоязычной ОС. Доустановить или удалить вовсе некоторые языки можно в установщике Visual Studio:
Отображение русских символов в 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(); }
Если русские символы в консоль выводятся некорректно через qDebug(), то решение для этого такое же, как и решение с отображением русских символов в виджетах Qt.
А если Вы пишете без Qt и у вас проблемы русскими символами при выводе в консоль, то почитайте статью, там есть решение — Русские символы(буквы) при вводе/выводе в консоль на C++.
Надеюсь, что статья Вам чем-то помогла.
Спасибо за внимание.
Добрый день, друзья!
Не понятно? Вот и с 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 Creator и MSVC2015 (Прочитано 21771 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Кракозябры в консоли сборки при использовании MSVC Express 2010 (русский) , Qt Creator 2.4.1 (Qt 4.8.1), Win 10.
По факту cl.exe выдает в 866 кодировке комментарии к ошибкам типа такого варианта:
:-1: ошибка: C2065: NUL: Ґ®Ўкпў«Ґл© Ё¤ҐвЁдЁЄ в®а
Пытались удалять русск. версию MSVS 2010 Espress, устанавливали Ultimate, Professinal, но все они как назло были русские.
Все оказалось проще. Нам помог выбор в параметрах Windows 10 языка ENGL!
:-1: error: C2065: 'NUL' : undeclared identifier
Следующий вариант — кракозябры в консоли при запуске программы, у которой используются библиотеки openssl , собранные из исходников стандартно через батники (где консоль была chcp 866).
Дело в том, что там в исходниках openssl есть дебаг вывод параметров сертификатов, которые содержат в том числе и не латинские символы.
Тут надо понимать, что сертификаты читаются из хранилища Windows. И оказывается есть сертификаты в кодировке 1251, а stdout куда они выводятся в кодировке 866. Как-то так наверное.
Чтобы вывод в stdout был правильным (читаемым) можно в программе указать :
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
И тогда мы увидим в консоли примерно такое:
expiredCerts CommonName : "УЦ ФГУП ГНИВЦ ФНС России" "Ср 2. сен 10:04:00 2020"
Не понятно почему в 2022г. Windows использует кодировку локали 866, 1251. Почему бы не использовать UTF8 ….
Всем доброго времени суток.
Поставил я себе QtCreator+MS Visual Studio 2010 на замену привычным gcc+SublimeText.
Столкнулся со следующей проблемой: ошибки и предупреждения компилятора выводятся крякозябрами, как-то так:
Код
C2065: a: *Ґ®Ўкпў«Ґ**л© Ё¤Ґ*вЁдЁЄ*в®а C4100: argv: *ҐЁбЇ®«м§®ў***л© д®а¬*«м*л© Ї*а*¬Ґва
Погуглив, я нашёл описание данной проблемы тут. Там же я нашёл и объяснение — компилятор VS даёт вывод в DOS (866) (рыдаю от такого раритета в предпоследней VS), а Qt Creator почему-то об этом не знает, и решение данной проблемы, которое, увы, мне не помогло.
Буду признателен, если кто-нибудь расскажет, как ещё это можно исправить.
Не понятно? Вот и с 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 знаете более красивый способ решения проблемы? Обязательно напишите в комментарии :-).