Перейти к содержимому

Как в qt creator подключить русский язык

  • автор:

Как в qt-creator вывести в консольном приложении русский текст вместо кракозябр (см картинка)?

dilepremon

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

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

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

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

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

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

Русский язык в Qt

Подскажите пожалуйста, как можно добавить поддержку русского языка в приложение QT. Пишу в Visual Studio (так как с QT Creator не разобрался, траблы с дебагером). Нужно что бы можно было обьявить переменную и занести в нее русский текст:

QString var = "Привет!"; 

Пробовал такой код:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251")); 

Если заношу текст в QByteArray , то все нормально, но я не могу с ним работать, мне далее нужно будет сравнивать строки. Если конвертирую в utf-8, то все равно кракозябра. Подскажите пожалуйста, как можно это реализовать.

Отслеживать
474 2 2 серебряных знака 10 10 бронзовых знаков
задан 4 мая 2017 в 17:19
67 1 1 золотой знак 2 2 серебряных знака 9 9 бронзовых знаков
А вы пробовали файлы исходного кода создавать с utf-8? (вне студии)
4 мая 2017 в 17:26
@free_ze Нет, а как это сделать?
4 мая 2017 в 17:28
Это умеет даже notepad, в диалоге сохранения в дропдауне ANSII замените на UTF-8.
4 мая 2017 в 17:29
@ free_ze То есть это можно сделать в любом текстовом редакторе да?
4 мая 2017 в 17:30

Рекомендую использовать Qt-ные возможности локализации. Тогда исходный код будет содержать строки только на английском языке, а их перевод будет храниться в отдельном файле.

4 мая 2017 в 18:22

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Должен работать вариант QString::fromLocal8Bit() , где локаль можно установить при помощи функции QTextCodec::setCodecForLocale() и QTextCodec::codecForName() , передав в последнюю Windows-1251:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251")); QString cyrillicName = QString::fromLocal8Bit("словоНаКириллице"); 

Обратите внимание на то, что QString использует utf-16 , поэтому прямое копирование байтов в QString (например, через QByteArray ) может давать не те результаты.

Отслеживать
ответ дан 4 мая 2017 в 18:37
1,377 1 1 золотой знак 12 12 серебряных знаков 21 21 бронзовый знак
Большое спасибо! Все получилось.
4 мая 2017 в 18:56

Если вы хотите прямо в исходном коде строку задать, то можно QStringLiteral макрос из qt5 применить:

#include int main() < QString s ; qDebug()

Это использует Юникодные константы ( u"" ), поэтому добавьте CONFIG += c++11 в ваш .pro файл.

Это более эффективный код, так как не происходит ненужного копирования и конвертирования из одной кодировки в другую ( u"" это UTF-16 и QString внутри UTF-16 + QStringLiteral magic).

Обратите внимание, что это никак не связано с кодировкой исходного кода ( input-charset ) и с кодировками, используемыми компилятором, для сохранения узких ( char ) и широких ( wchart_t ) строковых констант в исполняемом файле ( exec-charset ). Это также не имеет отношения к кодировкам используемых во внешних файлах или данных переданных по сети, итд -- суть в том что если данные у вас из другого источника, то решение специфичное для этого источника следует использовать (в разных контекстах, разные кодировки для текста могут быть).

input-charset , exec-charset это gcc имена. В VS это по другому настраивается Does VC have a compile option like '-fexec-charset' in GCC to set the execution character set?. На Visual Studio 2015 Update 2 CTP можно , /utf-8 опцию попробовать, которая равнозначна /source-charset:utf-8 плюс /execution-charset:utf-8 , см. Specification of source charset encoding in MSVC++, like gcc "-finput-charset=CharSet".

Ваш код QString var = "Привет!"; может работать, если вы выставите аналог exec-charset в VS в utf-8 для qt5 (используется по умолчанию). QString var = u8"Привет!"; будет работать даже без изменения exec-charset (исходный код может быть к примеру в cp1251 и всё будет работать, если компилятор именно эту кодировку ожидает) -- во время компиляции такие строки в utf-8 превращают. Но так как в любом случае QString использует utf-16 внутри, то такой код занимается ненужными преобразованиями текста из одной кодировки в другую.

Qt коддинг

Одна из стандартных проблем, с которой встречается каждый разработчик из России, это поддержка русского языка в приложениях на Qt. По умолчанию русский текст выводится кракозябрами, и может потребоваться довольно много времени чтобы всё-таки разобраться как это устранить.

На практике же надо выполнить 2 простых действия.
1. Включить в Qt Creator по умолчанию UTF-8 кодировку. Для этого необходимо зайти в Инструменты->Параметры и настроить кодировку как на рисунке ниже:

2. Подключить текстовый кодек в main.cpp . После изменений main.cpp станет выглядеть следующим образом:

#include  #include // подключение класса кодека текста #include "mainwindow.h" int main(int argc, char *argv[])   QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); //изменения QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); //изменения QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); //изменения QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); >
Всё, с этого момента любые ваши записи будут отображать полноценный русский язык.
По всем вопросам:
skype: austyh

Не отображаются русские символы и буквы в программе C++ и Qt.

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

Follow us on rss

Добрый день, читатель. По умолчанию русские символы в программах с использованием 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 и корректно открывать их после.

Русские символы в виджетах Qt

Помещая русские символы в поле 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

В начало функции 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 #include int main(int argc, char *argv[])

Вывод русских символов в консоль с Qt

Если русские символы в консоль выводятся некорректно через qDebug(), то решение для этого такое же, как и решение с отображением русских символов в виджетах Qt.

А если Вы пишете без Qt и у вас проблемы русскими символами при выводе в консоль, то почитайте статью, там есть решение — Русские символы(буквы) при вводе/выводе в консоль на C++.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *