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

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

  • автор:

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

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 под 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

Изменение языка интерфейса

Запускаем установщик Visual Studio Installer:

Запуск Visual Studio Installer

Выбор изменения пакетов Visual Studio

И в разделе Языковые пакеты снимаем галочку с русского пакета:

Снятие галочки у русского пакета

Применение изменений

Ждем, когда 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 и открываем его:

Нахождение файла проекта

Выбор компилятора Visual Studio

Открытый проект

В подпроекте app находим файл main.cpp :

Нахождение файла main.cpp

Находим так функцию main :

Функция main

И там в самом начале этой функции добавляем строчки:

SetConsoleCP(1251); SetConsoleOutputCP(1251); 

Добавленные строчки

Сохраняем изменения Ctrl + S .

Компилировать будем в режиме Release :

Выбор режима Release

И компилируем наш проект:

Компилирование проекта

В процессе компиляции вы увидим несколько предупреждений. Это ничего страшного. Главное, чтобы ошибок не было.

Кстати, предупреждения будут с крякозябрами:

Предупреждения в виде крякозябр

Через некоторое время серый треугольник запуска проекта опять станет зеленым. Значит, проект скомпилировался:

Треугольник запуска опять зеленый

Находим скомпилированный jom файл

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

По умолчанию, если у вас проект, например, называется HarrixTesting , то в папке HarrixTesting , где находится папка, появится папка наподобие такой: build-HarrixTesting-Desktop_Qt_5_5_0_MinGW_32bit-Release (это под MinGW компилятор пример):

Папка с скомпилированным проектом

В этой папке меня интересует папка bin :

Папка bin

Там должен быть файл jom.exe :

Файл jom.exe

Замена jom файла

Переходим в папку, где находится файл qtcreator.exe . У меня это папка C:\Qt\Qt5.8.0\Tools\QtCreator\bin :

Папка с родным jom.exe

Переименуйте его, чтобы на всякий случай не потерять, если что пойдет не так:

Переименование родного файла

И вставьте сюда скомпилированный 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.

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

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