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Как в qt-creator вывести в консольном приложении русский текст вместо кракозябр (см картинка)?
"Хотя уже давно разработан единый стандарт кодирования символов — 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 под Visual Studio
Итак, если вы используете версию Qt под компилятор Visual Studio, то в консоли, где появляются сообщения об ошибках и предупреждениях, вместо русских букв будут появляться крякозябры. Будем это лечить.
Крякозябры
Вот так выглядят крякозябры:
Данная проблема возникает, если использовать русскую версию Visual Studio, ввиду разных кодировок в консолях. В Qt нам нужна кодировка cp1251 .
Вся проблема, кроется в том, что специальная утилита jom , неправильно задает кодировку. Мы в ней исправим это и перекомпилируем утилиту самим же Qt.
Новый способ решения проблемы
Вот только несколько дней назад всё работало на Visual Studio 2017 и Qt 5.11.1. И старый способ с перестраиванием jom проекта работал, но обновил обе программы, и способ работать перестал. Чьё обновление виновато — не знаю.
Поэтому придется обойтись без переделки jom. Алгоритм решения: переводим Visual Studio на английский язык и удаляем русский пакет полностью. И сообщения компилятора будут приходить не крякозябрами, а в виде нормальных английских сообщений.
Сейчас нет возможности проверить, но в прошлом (пару лет назад) при переводе Visual Studio на английский язык после установки Qt возникали проблемы с компиляцией. Так что лучше перевести на английский язык Visual Studio, а потом установить Qt (как у меня сейчас), но может быть уже всё пофиксили.
Итак, меняем язык интерфейса Visual Studio на английский (сообщения компилятора всё равно будут приходить на русском в виде крякозябр):
Запускаем установщик Visual Studio Installer:
И в разделе Языковые пакеты снимаем галочку с русского пакета:
Ждем, когда Visual Studio всё удалит и, скорее всего, установит какие-то свои обновления. После этого перезапускаем Qt Creator. Теперь при компиляции сообщения будут приходить нормальными, но на английском:
P.S. Правда после этого приложения под UWP перестали компилироваться и выдают ошибку вроде этой:
13:44:39: Could not start process "windeployqt.exe" D:\Harrix\Projects\QtProjects\untitled12\_build\release\untitled12.exe --qmldir D:\Harrix\Projects\QtProjects\untitled12 Error while building/deploying project untitled12 (kit: Qt 5.11.1 for UWP 64bit (MSVC 2017)) The kit Qt 5.11.1 for UWP 64bit (MSVC 2017) has configuration issues which might be the root cause for this problem. When executing step "Run windeployqt"Старый способ решения проблемы
Может потом старый способ заработает, так что оставлю его в статье.
Всё описанное ниже проводилось на Windows 10. Были установлены Visual Studio 2015 Community, Qt 5.8.0 под Visual Studio.
Выкачка исходных кодов jom
Выкачать можно с помощью консоли Git:
git clone https://github.com/qt-labs/jomЕсли вы не знаете как выполнить эту команду, то перейдите по адресу https://github.com/qt-labs/jom и скачайте исходные коды программы с сайта:
Изменение jom
Открываем Qt Creator. И там переходим к пункту открытия проекта:
И в папке с исходниками jom находим файл jom.pro и открываем его:
В подпроекте app находим файл main.cpp :
Находим так функцию main :
И там в самом начале этой функции добавляем строчки:
SetConsoleCP(1251); SetConsoleOutputCP(1251);
Сохраняем изменения Ctrl + S .
Компилировать будем в режиме Release :
И компилируем наш проект:
В процессе компиляции вы увидим несколько предупреждений. Это ничего страшного. Главное, чтобы ошибок не было.
Кстати, предупреждения будут с крякозябрами:
Через некоторое время серый треугольник запуска проекта опять станет зеленым. Значит, проект скомпилировался:
Находим скомпилированный jom файл
Перейдите в папку, где у вас находятся скомпилированные файлы Qt.
По умолчанию, если у вас проект, например, называется HarrixTesting , то в папке HarrixTesting , где находится папка, появится папка наподобие такой: build-HarrixTesting-Desktop_Qt_5_5_0_MinGW_32bit-Release (это под MinGW компилятор пример):
В этой папке меня интересует папка bin :
Там должен быть файл jom.exe :
Замена jom файла
Переходим в папку, где находится файл qtcreator.exe . У меня это папка C:\Qt\Qt5.8.0\Tools\QtCreator\bin :
Переименуйте его, чтобы на всякий случай не потерять, если что пойдет не так:
И вставьте сюда скомпилированный jom.exe файл:
Всё. Теперь можете запускать Qt и проверять крякозябры. У меня они ушли:
- Qt logo 2016.svg by Qt Project / (2019-01-26)
Статья обновлена 2018-08
Итак, если вы используете версию Qt под компилятор Visual Studio, то в консоли, где появляются сообщения об ошибках и предупреждениях, вместо русских букв будут появляться крякозябры. Будем это лечить.
Итак, если вы используете версию Qt под компилятор Visual Studio, то в консоли, где появляются сообщения об ошибках и предупреждениях, вместо русских букв будут появляться крякозябры. Будем это лечить.
Harrix
- GitHub User
- [email protected]
Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.



























