Одно из возможных решений – скрыть для компилятора 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:
Для 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:
|
Автор | Тема: [РЕШЕНО] Кракозябры в окне ошибок нового Qt Creator и MSVC2015 (Прочитано 23395 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Не понятно? Вот и с 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 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Отображение русских символов в 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 знаете более красивый способ решения проблемы? Обязательно напишите в комментарии :-).
Хм, 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 библиотеки, имеется другой вариант в этой статье.
Заблокирован |
||||||||||||||||
1 |
||||||||||||||||
08.08.2016, 19:05. Показов 1248. Ответов 7 Метки нет (Все метки)
Помогите разобраться, почему при компиляции этого проекта высыпается куча ошибок, и подскажите, как настроить QtCreator так, чтобы сообщения об ошибках выводились в правильной кодировке. Использую компилятор VS 2015. calc.h
calc.cpp
main.cpp
Проектный файл:
Одна из недавних ошибок заключалась в том, что линкер не мог резрешить одно имя: это имя конструктора класса. Теперь я получаю кучу неразборчивых ошибок в неправильной кодировке, и они, видимо, сообщают об отсутствующих методах используемых библиотечных классов. Добавлено через 1 минуту 0 |
soaup 7 / 7 / 1 Регистрация: 02.06.2014 Сообщений: 110 |
||||
08.08.2016, 19:28 |
2 |
|||
Рубрика бредовых идей — в .CPP файле здесь
попробуйте просто QWidget *wgt 0 |
Заблокирован |
|
08.08.2016, 19:34 [ТС] |
3 |
>попробуйте просто QWidget *wgt Пробовал это первым же делом. Не помогло. 0 |
1068 / 650 / 229 Регистрация: 14.01.2016 Сообщений: 2,031 Записей в блоге: 9 |
|
10.08.2016, 15:13 |
4 |
Одна из недавних ошибок заключалась в том, что линкер не мог резрешить одно имя: это имя конструктора класса. Теперь я получаю кучу неразборчивых ошибок в неправильной кодировке, и они, видимо, сообщают об отсутствующих методах используемых библиотечных классов. http://blog.harrix.org/article/5888 0 |
7391 / 6307 / 2862 Регистрация: 14.04.2014 Сообщений: 27,334 |
|
10.08.2016, 18:10 |
5 |
как настроить QtCreator так Английскую версию VS попробуй. 0 |
Заблокирован |
|
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 |
Заблокирован |
|
13.08.2016, 17:48 [ТС] |
8 |
Сменил язык QtCreator, поставил языковой пакет для vs2015, на английском стало намного приятнее работать, но ошибки в неправильной кодировке никуда не делись — компилятор остался нерусифицированным. Билд удалял. Добавлено через 17 минут 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 фреймворка отображаются некорректно. Вместо них используются непонятные знаки. Эта проблема появляется при открытии исходников программ, при выводе русских букв в консоль, при выводе русских букв в виджеты (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++.
Надеюсь, что статья Вам чем-то помогла.
Спасибо за внимание.