|
Автор | Тема: QTextCodec Windows-1251 (Прочитано 9139 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Отображение русских символов в 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++.
Надеюсь, что статья Вам чем-то помогла.
Спасибо за внимание.
задан 15 фев 2015 в 9:09
perfectperfect
9,92113 золотых знаков50 серебряных знаков109 бронзовых знаков
5
Доброго времени суток!
Ваше решение не самое лучшее — в Qt 5 оно не будет работать, поскольку в Qt 5 отсутствует статический метод QTextCodec::setCodecForTr()
(http://doc.qt.io/qt-5/qtextcodec.html).
Разработчики Qt советуют перевести все исходные файлы проекта в кодировку UTF-8, и проблема исчезнет сама собой)
Успехов!
ответ дан 24 фев 2015 в 20:21
2
Победил следующим образом:
- Заходим Инструменты->Параметры->Текстовый редактор->По умолчанию->Кодировки файлов->По умолчанию — устанавливаем windows-1251
- Добавляем заголовок
#include <QTextCodec>
-
В самом начале функции main пишем следующее
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(«CP1251»));
QTextCodec::setCodecForLocale(QTextCodec::codecForName(«CP1251»));
QTextCodec::setCodecForTr(QTextCodec::codecForName(«CP1251»)); -
все работает
ответ дан 15 фев 2015 в 13:52
perfectperfect
9,92113 золотых знаков50 серебряных знаков109 бронзовых знаков
Для Qt6 и проектов CMake простое элегантное решение:
- Добавляем в конец файла CMakeLists.txt строку:
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${PROJECT_SOURCE_DIR}/decode.bat")
- Помещаем текстовый файл decode.bat в папку, где лежит CMakeLists.txt с содержимым:
@chcp 1251 >nul @call %*
0xdb
51.2k194 золотых знака56 серебряных знаков227 бронзовых знаков
ответ дан 20 янв 2021 в 23:53
Вывод кириллицы в консоли QT5
Распространённая у новичков проблема Следует понимать, что QT – кроссплатформенный продукт. Удовлетворительного решения для вывода кириллицы именно в консоли Windows (в отличие от Linux) нет. В QT5 можно попробовать:
QTextCodec *coding = QTextCodec::codecForName("utf-8"); coding->setCodecForLocale(coding);
или
system("chcp 65001");
если ваши файлы в Юникоде (UTF-8). Соответственно, "cp-1251"
и "chcp 1251"
для российской кодировки Windows. Сам текст файла .cpp
, конечно же, тоже должен быть сохранён в нужной кодировке.
Популярное в сети решение с вызовом setCodecForCStrings
и setCodecForTr
работало только до QT4 включительно. А лучше делать свою консоль на основе QTextEdit
, кроме работы с кодировками, будут возможности для оформления. Кроме того, для написания современных приложений следует, в общем случае, предпочитать Юникод.
Консольное приложение может быть реализовано и без использования класса QCoreApplication
. В этом случае работа со стандартной консолью Windows возможна следующим образом:
#include <QTextStream> #include <conio.h> int main() { QTextStream cin(stdin); cin.setCodec("CP866"); QTextStream cout(stdout); cout.setCodec("CP866"); cout << QString::fromUtf8("Введите ваше имя: "); cout.flush(); QString name; cin >> name; cout << QString::fromUtf8("Привет, ") << name << QString::fromUtf8("!") << endl; return 0; }
Проверено в Windows 7 + QT5.2.1, сработало. Обратите внимание, что кодировка консоли здесь именно CP866 (DOS), как и было для DOS-приложений.
Кроме того, можно пользоваться стандартными возможностями C++ (setlocale
)
P.S. В более новых сборках QT 5 со средой Creator 4.X приходилось также указывать CP866 только для ввода, а для вывода CP1251 (пример кода для консоли QT 5 показан ниже), менять шрифт, назначенный для консольных приложений и т.п. В целом, думаю, на проблеме зацикливаться не стоит, все ваши реальные приложения всё равно будут не-консольными и в UTF-8
#include <iostream> #include <QTextStream> using namespace std; int main() { setlocale(LC_ALL, "Rus"); QTextStream cin(stdin); cin.setCodec("CP866"); QTextStream cout(stdout); cout.setCodec("CP1251"); QString name; cout << QString::fromUtf8("Как Вас зовут? ") << endl; cin >> name; cout << QString::fromUtf8("Привет, ") << name << "!"; return 0; }
02.02.2016, 17:24 [13816 просмотров]
К этой статье пока нет комментариев, Ваш будет первым