Qt кракозябры вместо ошибок

Одно из возможных решений – скрыть для компилятора cl.exe файлы со строками языка ОС. В данном случае речь о локале ru-ru с идентификатором LCID, равным 1049. Полный список идентификаторов можно посмотреть здесь, стоит учесть, что там они указаны в шестнадцатеричном виде.

В зависимости от версии и разрядности компилятора, выбранного для Qt-проекта, расположение файла cl.exe может разниться. Например, для MSVC2015 64bit путь будет такой:

{Коренная папка Visual Studio}\VC\bin\amd64

В MSVC2017 структура пути несколько иная:

{Коренная папка Visual Studio}\VC\Tools\MSVC\{версия}\bin\Hostx86\x64

Имя конечной папки можно подсмотреть в настройках сборки проекта в QtCreator:

Compiler path

Для MSVC2017 x86_amd64, представленная на рисунке, будет как раз соответствовать Hostx86\x64 (завершающая часть пути).

По этому пути достаточно переименовать папку «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:

Установщик VS

Автор Тема: [РЕШЕНО] Кракозябры в окне ошибок нового Qt Creator и MSVC2015  (Прочитано 23395 раз)
gil9red

Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805

Просмотр профиля
WWW


Ставил недавно новый Qt, с ним в комплекте был уже и креатор, и компилятор.

При компиляции нашлись ошибки и их вид меня напрягает. Это он так кирилицу попытался отобразить? Как исправить?
Или научиться его ругаться на английском…

РЕШЕНИЕ:

переименовать файл:
%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\bin\1049\clui.dll
в какой-нибудь clui.dll.bak
или удалить

выхлоп компилятора студии станет английским.

« Последнее редактирование: Декабрь 31, 2016, 00:40 от gil9red »
Записан

Bepec

Гость


Да падёт на тебя кара криворуких программистов, которые крестятся при виде кириллицы Веселый
хз как. Есть радикальный метод вроде полной пересборки креатора, но я чет не такой садомазохист Веселый


Записан
panAlexey

Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(

Просмотр профиля


ошибки в mainwindow.cpp — позор! Улыбающийся

« Последнее редактирование: Декабрь 30, 2016, 19:02 от panAlexey »
Записан

kambala


русская visual studio? замена на английскую поможет.

вообще никогда не использую русский интерфейс в средах разработки.


Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

gil9red

Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805

Просмотр профиля
WWW


ошибки в mainwindow.cpp — позор!

В том примере mainwindow.cpp вообще пустой: http://ru.stackoverflow.com/questions/609515/
 Веселый

русская visual studio? замена на английскую поможет.

вообще никогда не использую русский интерфейс в средах разработки.

Я ничего кроме темной темы не настраивал специально — скачал и установил. Так что креатор уже был русскоязычным и у него уже был тот комплект

// UPDATE: ну да — у креатора стоит «системный язык», поэтому интерфейс тоже русскоязычный

А моя студия англоязычная:

« Последнее редактирование: Декабрь 30, 2016, 16:51 от gil9red »
Записан

kambala


переключение креатора на английский помогает?

з.ы. отличный кусок кода ты показал))


Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

Bepec

Гость


Это великая тайна… Почему программисты Qt Creator’a не могут осилить toLocal8Bit() в консоли уже аж третью версию. Хотя в релизе всё нормально Веселый


Записан
panAlexey

Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(

Просмотр профиля


Мне на такой вопрос как-то ответили: не выпендривайся и ставь английскую студию.


Записан

Bepec

Гость


Да без разницы,это проблема именно креатора. Студия всегда нормально работала с кириллицей, начиная с 2008 полностью поддерживала в любой кодировке.


Записан
qate


я всегда учу все программы ругаться на английском просто: LC_MESSAGES=C
вот бы для венды также найти, не редко надо, потому не знаю как


Записан
Johnik

Крякер
****
Online Online

Сообщений: 339

Просмотр профиля


переименовать файл:
%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\bin\1049\clui.dll
в какой-нибудь clui.dll.bak
или удалить

выхлоп компилятора студии станет английским.


Записан

Добрый день, друзья!

Не понятно? Вот и с 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_USER\Software\Microsoft\Command 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 "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t reg_expand_sz /d "chcp 1251 1>nul" /f
C:\Qt\qtcreator-2.5.0\bin\qtcreator.exe
reg delete "HKCU\Software\Microsoft\Command 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  (Прочитано 22251 раз)
gil9red


Ставил недавно новый Qt, с ним в комплекте был уже и креатор, и компилятор.

При компиляции нашлись ошибки и их вид меня напрягает. Это он так кирилицу попытался отобразить? Как исправить?
Или научиться его ругаться на английском…

РЕШЕНИЕ:

переименовать файл:
%ProgramFiles(x86)%Microsoft Visual Studio 14.0VCbin1049clui.dll
в какой-нибудь clui.dll.bak
или удалить

выхлоп компилятора студии станет английским.

« Последнее редактирование: Декабрь 31, 2016, 00:40 от gil9red »
Записан

Bepec

Гость


Да падёт на тебя кара криворуких программистов, которые крестятся при виде кириллицы Веселый
хз как. Есть радикальный метод вроде полной пересборки креатора, но я чет не такой садомазохист Веселый


Записан
panAlexey

Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(

Просмотр профиля


ошибки в mainwindow.cpp — позор! Улыбающийся

« Последнее редактирование: Декабрь 30, 2016, 19:02 от panAlexey »
Записан

kambala

русская visual studio? замена на английскую поможет.

вообще никогда не использую русский интерфейс в средах разработки.


Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

gil9red


ошибки в mainwindow.cpp — позор!

В том примере mainwindow.cpp вообще пустой: http://ru.stackoverflow.com/questions/609515/
 Веселый

русская visual studio? замена на английскую поможет.

вообще никогда не использую русский интерфейс в средах разработки.

Я ничего кроме темной темы не настраивал специально — скачал и установил. Так что креатор уже был русскоязычным и у него уже был тот комплект

// UPDATE: ну да — у креатора стоит «системный язык», поэтому интерфейс тоже русскоязычный

А моя студия англоязычная:

« Последнее редактирование: Декабрь 30, 2016, 16:51 от gil9red »
Записан

kambala

переключение креатора на английский помогает?

з.ы. отличный кусок кода ты показал))


Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

Bepec

Гость


Это великая тайна… Почему программисты Qt Creator’a не могут осилить toLocal8Bit() в консоли уже аж третью версию. Хотя в релизе всё нормально Веселый


Записан
panAlexey

Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(

Просмотр профиля


Мне на такой вопрос как-то ответили: не выпендривайся и ставь английскую студию.


Записан

Bepec

Гость


Да без разницы,это проблема именно креатора. Студия всегда нормально работала с кириллицей, начиная с 2008 полностью поддерживала в любой кодировке.


Записан
qate

я всегда учу все программы ругаться на английском просто: LC_MESSAGES=C
вот бы для венды также найти, не редко надо, потому не знаю как


Записан
Johnik

Крякер
****
Online Online

Сообщений: 336

Просмотр профиля


переименовать файл:
%ProgramFiles(x86)%Microsoft Visual Studio 14.0VCbin1049clui.dll
в какой-нибудь clui.dll.bak
или удалить

выхлоп компилятора студии станет английским.


Записан

Отображение русских символов в Qt

Отображение русских символов в Qt

Добрый день, читатель. По умолчанию русские символы в программах с использованием Qt фреймворка отображаются некорректно. Вместо них используются непонятные знаки. Эта проблема появляется при открытии исходников программ, при выводе русских букв в консоль, при выводе русских букв в виджеты (Label, PlainText и т.д.). В этой статье содержатся решения этих проблем. На сайте уже имеется статья, в которой показано решение проблемы отображения русских букв при выводе в консоль на C++.

Русские символы в исходном коде

Бывает возникает проблема с кодировкой при открытии исходных текстов программ в Qt Creator, чаще всего такая проблема возникает у пользователей Windows. Дело в том, что при написании программы исходники иногда сохраняются в одной кодировке, а редактор в Qt Creator открывает по умолчанию в другой кодировке. Из-за этого вместо русских букв появляются кракозябры или знаки вопроса. По умолчанию в настройках редактора кода Qt Creator кодировка файлов устанавливается System, т.е. кодировка операционной системы. Linux чаще всего использует UTF-8, а Windows cp1251.

Проблема с кодировкой в редакторе Qt Creator

Проблема с кодировкой в редакторе 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

Русские символы в редакторе форм Qt

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

Отображение русских символов в виджетах

Отображение русских символов в виджетах

Отображение символов корректно. Теперь в изменим текст в виджетах программным путем, для этого в редакторе кода в файле mainwindow.cpp в конструктор добавим пару строк:

    ui->label->setText("Русские символы");
    ui->pushButton->setText("И здесь");

А затем скомпилируем и запустим программу.

Проблемы с отображением русских символов

Проблемы с отображением русских символов

Как видно, проблема имеет место быть, но решить ее очень легко.

Для этого устанавливаем текст с помощью функции trUtf8().

    ui->label->setText(trUtf8("Русские символы"));
    ui->pushButton->setText(trUtf8("И здесь"));

Скомпилируем и запустим программу.

Корректное отображение с 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 знаете более красивый способ решения проблемы? Обязательно напишите в комментарии :-).

Хм, 3 минуты гугла и первая ссылка выдали это:

«Хотя уже давно разработан единый стандарт кодирования символов — Unicode, в Windows до сих пор используются несколько кодировочных таблиц, а именно — cp866, cp1251. Использование нескольких таблиц кодирования символов и является причиной появления козябликов, вместо кириллицы в консоли.

Так уж повелось, в командной строке Windows кодировка символов соответствует стандарту cp866. То есть все символы в командной строке Windows закодированы по кодировочной таблице cp866. Причём поменять кодировку в командной строке Windows нельзя. Просмотреть стандарт кодирования символов в консоли можно, с помощью команды GRAFTABL

Решить данную проблему можно только одним способом — перед тем, как передать текст в консоль, необходимо его перекодировать в стандарт кодирования символов cp866.»

и это:

«Для ввода/вывода используйте текстовые потоки, для потока следует установить кодек, транслирующий текст в кодировку, применяемую в консоли. Поэтому для вашей системы имя кодека может быть и не «cp866». Приведенный ниже пример предполагает использование Qt 5, а кодировка исходного текста программы — UTF-8″

#include <QCoreApplication>
#include <QTextStream>
#include <QTextCodec>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QTextStream outStream(stdout);
    outStream.setCodec(QTextCodec::codecForName("cp866"));
    outStream << QString("Русский текст в консоли") << flush;
 
    return a.exec();
}

P.S. Если по какой-то причине не используются Qt библиотеки, имеется другой вариант в этой статье.

Invoke Virtual

Заблокирован

1

08.08.2016, 19:05. Показов 1248. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Помогите разобраться, почему при компиляции этого проекта высыпается куча ошибок, и подскажите, как настроить QtCreator так, чтобы сообщения об ошибках выводились в правильной кодировке. Использую компилятор VS 2015.

calc.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef CALC_H
#define CALC_H
 
#include <QWidget>
#include <QStack>
#include <QString>
 
class QLCDNumber;
class QPushButton;
 
class Calculator : public QWidget
{
    Q_OBJECT
private:
    QLCDNumber*         m_plcd;
    QStack<QString>     m_stk;
    QString             m_strDisplay;
 
public:
    Calculator(QWidget *wgt = 0);
    QPushButton* createButton(const QString& str);
    void calculate();
public slots:
    void slotButtonClicked();
};
 
#endif // CALC_H

calc.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "calc.h"
 
Calculator::Calculator(QWidget *wgt = 0) : QWidget(wgt)
{
    m_plcd = new QLCDNumber(12);
    m_plcd->setSegmentStyle(QLCDNumber::Flat);
    m_plcd->setMinimumSize(150, 50);
 
    QChar aButtons[4][4] = {{'7', '8', '9', '/'},
                            {'4', '5', '6', '*'},
                            {'1', '2', '3', '-'},
                            {'0', '.', '=', '+'}};
 
    QGridLayout *ptopLayout = new QGridLayout;
    ptopLayout->addWidget(m_plcd, 0, 0, 1, 4);
    ptopLayout->addWidget(createButton("CE"), 1, 3);
 
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            ptopLayout->addWidget(createButton(aButtons[i][j]), i + 2, j);
        }
    }
    setLayout(ptopLayout);
}
 
QPushButton* Calculator::createButton(const QString& str)
{
    QPushButton *pcmd = new QPushButton(str);
    pcmd->setMinimumSize(40, 40);
    connect(pcmd, SIGNAL(clicked), SLOT(slotButtonClicked));
    return pcmd;
}
 
void Calculator::calculate()
{
    double dOperand2 = m_stk.pop().toDouble();
    QString strOperation = m_stk.pop();
    double dOperand1 = m_stk.pop().toDouble();
    double dResult = 0;
 
    if(strOperation == "+")
    {
        dResult = dOperand1 + dOperand2;
    }
    if(strOperation == "-")
    {
        dResult = dOperand1 - dOperand2;
    }
    if(strOperation == "/")
    {
        dResult = dOperand1 / dOperand2;
    }
    if(strOperation == "*")
    {
        dResult = dOperand1 * dOperand2;
    }
 
    m_plcd->display(dResult);
}
 
void Calculator::slotButtonClicked()
{
    QString str = ((QPushButton *)sender())->text();
 
    if (str == "CE")
    {
        m_stk.clear();
        m_strDisplay = "";
        m_plcd->display("0");
        return;
    }
    if (str.contains(QRegExp("[0-9]")))
    {
        m_strDisplay += str;
        m_plcd->display(m_strDisplay.toDouble());
    }
    else if (str == ".")
    {
        m_strDisplay += str;
        m_plcd->display(m_strDisplay);
    }
    else
    {
        if (m_stk.count() >= 2)
        {
            m_stk.push(QString.setNum(m_plcd->value()));
            calculate();
            m_stk.clear();
            m_stk.push(QString.setNum(m_plcd.value()));
            if (str != "=")
            {
                m_stk.push(str);
            }
        }
        else
        {
            m_stk.push(QString().setNum(m_plcd->value()));
            m_strDisplay = "";
            m_plcd->display("0");
        }
    }
}

main.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QtGui>
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Calculator calculator;
 
    calculator.setWindowTitle("Calculator");
    calculator.resize(230, 200);
 
    calculator.show();
 
    return app.exec();
}

Проектный файл:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#-------------------------------------------------
#
# Project created by QtCreator 2016-08-08T18:49:52
#
#-------------------------------------------------
 
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = Main
TEMPLATE = app
 
 
SOURCES += main.cpp
    calc.cpp
 
HEADERS  += 
    calc.h

Одна из недавних ошибок заключалась в том, что линкер не мог резрешить одно имя: это имя конструктора класса. Теперь я получаю кучу неразборчивых ошибок в неправильной кодировке, и они, видимо, сообщают об отсутствующих методах используемых библиотечных классов.

Добавлено через 1 минуту
Дополнительно: скачивал последнюю версию QtCreator с сайта Qt.io

0

soaup

7 / 7 / 1

Регистрация: 02.06.2014

Сообщений: 110

08.08.2016, 19:28

2

Рубрика бредовых идей — в .CPP файле здесь

C++ (Qt)
1
Calculator::Calculator(QWidget *wgt = 0) : QWidget(wgt)

попробуйте просто QWidget *wgt

0

Invoke Virtual

Заблокирован

08.08.2016, 19:34

 [ТС]

3

>попробуйте просто QWidget *wgt

Пробовал это первым же делом. Не помогло.

0

1068 / 650 / 229

Регистрация: 14.01.2016

Сообщений: 2,031

Записей в блоге: 9

10.08.2016, 15:13

4

Цитата
Сообщение от Invoke Virtual
Посмотреть сообщение

Одна из недавних ошибок заключалась в том, что линкер не мог резрешить одно имя: это имя конструктора класса. Теперь я получаю кучу неразборчивых ошибок в неправильной кодировке, и они, видимо, сообщают об отсутствующих методах используемых библиотечных классов.

http://blog.harrix.org/article/5888

0

7391 / 6307 / 2862

Регистрация: 14.04.2014

Сообщений: 27,334

10.08.2016, 18:10

5

Цитата
Сообщение от Invoke Virtual
Посмотреть сообщение

как настроить QtCreator так

Английскую версию VS попробуй.

0

Invoke Virtual

Заблокирован

12.08.2016, 15:31

 [ТС]

6

Английскую версию VS попробуй.

Боюсь ее переустанавливать, потому что однажды у меня уже было так, что после удаления она снова не установилась. Нельзя ли просто язык изменить каким-нибудь патчем?

0

0 / 0 / 1

Регистрация: 17.06.2016

Сообщений: 25

13.08.2016, 13:12

7

Инструменты -> настройки -> среда -> язык(часть ошибок начала выводиться нормально, но не все)! Помогает удаление build(имя проекта) и ошибки пропадают после Ctrl+R!!!! И это ж пример из Шлее Qt 5.3, http://www.bhv.ru/books/book.php?id=193181 «файлы для загрузки» там все исходники примеров с книги, там есть этот калькулятор(6 глава)!

0

Invoke Virtual

Заблокирован

13.08.2016, 17:48

 [ТС]

8

Сменил язык QtCreator, поставил языковой пакет для vs2015, на английском стало намного приятнее работать, но ошибки в неправильной кодировке никуда не делись — компилятор остался нерусифицированным. Билд удалял.

Добавлено через 17 минут
Взял jom.exe отсюда, скопировал в папки bin для разных версий qt, где лежит qmake, поставил галочку в настройках, но это не помогло.

0

В статье рассказывается об одном костыле для отображения русских букв в консольных приложениях Qt. В статье рассматривается приложение на основе Qt 5.4.0.

В Qt версии 5 и выше поменялись некоторые настройки и стандартные костыли по отображению русских букв в консоли не работают.

Суть проблемы. В стандартной консольной программе вместо русского текста будет выведены крякозабры:

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

Q_UNUSED(argc);

Q_UNUSED(argv);

   cout << «Привет!»;

   return a.exec();

}

Решение.

Прописываем нужные кодировки:

#ifdef Q_OS_WIN32

   QTextCodec::setCodecForLocale(QTextCodec::codecForName(«IBM 866»));

#endif

#ifdef Q_OS_LINUX

   QTextCodec::setCodecForLocale(QTextCodec::codecForName(«UTF-8»));

#endif

Здесь нужно обратить внимание, что QTextCodec существует независимо от объекта QApplication. Объекта приложения вообще нет в этих примерах кода.

Чтобы настройка QTextCodec работала, нужно еще подключить:

#include <QTextCodec>

А текст отображается в виде костыля:

QString::fromUtf8(«Текст»).toLocal8Bit().data()

Программа в итоге будет выглядеть так:

#include <iostream>

#include <QTextCodec>

using namespace std;

int main(int argc, char *argv[])

{

Q_UNUSED(argc);

Q_UNUSED(argv);

#ifdef Q_OS_WIN32

   QTextCodec::setCodecForLocale(QTextCodec::codecForName(«IBM 866»));

#endif

#ifdef Q_OS_LINUX

   QTextCodec::setCodecForLocale(QTextCodec::codecForName(«UTF-8»));

#endif

   cout << QString::fromUtf8(«Привет!»).toLocal8Bit().data();

   return 0;

}

Если используете переменные, то будет попроще:

QString S=»Здравствуйте!»;

cout << S.toLocal8Bit().data();

Как можно еще упростить жизнь? В коде выше вывод шел в стандартную консоль cout. Но если выводить строки с использованием отладочного вывода, то никаких преобразований производит не надо:

qDebug() << «Привет!»;

То есть, достаточно настроить значение QTextCodec::setCodecForLocale(кодировка) , и вывод qDebug() будет автоматически преобразовываться из UTF-8 (ведь файлы исходников в Qt пишутся в UTF-8) в нужную кодировку. То же самое касается и qInfo(), qWarning(), qCritical(), qFatal().

Отображение русских символов в Qt

Отображение русских символов в Qt

Добрый день, читатель. По умолчанию русские символы в программах с использованием Qt фреймворка отображаются некорректно. Вместо них используются непонятные знаки. Эта проблема появляется при открытии исходников программ, при выводе русских букв в консоль, при выводе русских букв в виджеты (Label, PlainText и т.д.). В этой статье содержатся решения этих проблем. На сайте уже имеется статья, в которой показано решение проблемы отображения русских букв при выводе в консоль на C++.

Русские символы в исходном коде

Бывает возникает проблема с кодировкой при открытии исходных текстов программ в Qt Creator, чаще всего такая проблема возникает у пользователей Windows. Дело в том, что при написании программы исходники иногда сохраняются в одной кодировке, а редактор в Qt Creator открывает по умолчанию в другой кодировке. Из-за этого вместо русских букв появляются кракозябры или знаки вопроса. По умолчанию в настройках редактора кода Qt Creator кодировка файлов устанавливается System, т.е. кодировка операционной системы. Linux чаще всего использует UTF-8, а Windows cp1251.

Проблема с кодировкой в редакторе Qt Creator

Проблема с кодировкой в редакторе 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

Русские символы в редакторе форм Qt

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

Отображение русских символов в виджетах

Отображение русских символов в виджетах

Отображение символов корректно. Теперь в изменим текст в виджетах программным путем, для этого в редакторе кода в файле mainwindow.cpp в конструктор добавим пару строк:

    ui->label->setText("Русские символы");
    ui->pushButton->setText("И здесь");

А затем скомпилируем и запустим программу.

Проблемы с отображением русских символов

Проблемы с отображением русских символов

Как видно, проблема имеет место быть, но решить ее очень легко.

Для этого устанавливаем текст с помощью функции trUtf8().

    ui->label->setText(trUtf8("Русские символы"));
    ui->pushButton->setText(trUtf8("И здесь"));

Скомпилируем и запустим программу.

Корректное отображение с 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++.

Надеюсь, что статья Вам чем-то помогла.

Спасибо за внимание.

Понравилась статья? Поделить с друзьями:
  • Python перезапуск скрипта после ошибки
  • Qt platform plugin windows ошибка как исправить amd
  • Python пользовательские ошибки
  • Qt designer ошибка генерации кода
  • Python повторять пока ошибка