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

574
06 мая 2017, 22:57

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

Нужно что бы можно было обьявить переменную и занести в нее русский текст:

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

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

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

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

Подскажите пожалуйста, как можно это реализовать.

Answer 1

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

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

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

Answer 2

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

#include <QDebug>
int main()
{
  QString s {QStringLiteral(u"Привет!")};
  qDebug() << s;
}

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

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

Обратите внимание, что это никак не связано с кодировкой исходного кода (input-charset) и с кодировками, используемыми компилятором, для сохранения узких (char) и широких (wchart_t) строковых констант в исполняемом файле ({,wide-}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 внутри, то такой код занимается ненужными преобразованиями текста из одной кодировки в другую.

Answer 3

Просто сохраняйте исходники в utf8 и используйте

QString var = QString::fromUtf8("Привет!");

Не очень удобно, но работает.

Еще можно префикс u из c++11 применить, особенно если исходники не в utf8:

auto var = QString::fromUtf8(u"Привет!");
READ ALSO
Не определяется функция printf в eclipse

Не определяется функция printf в eclipse

Не определяется функция printf в eclipse:

287
Undefined reference to cv::

Undefined reference to cv::

Пытаюсь заставить работать OpenCV и Stasm вместе на Ubuntu 1604 lts

354
Фильтрация по размеру пакета

Фильтрация по размеру пакета

Доброго времени суток! Никак не могу понять, как отфильтровать трафик в winpcap по размеру пакета(в моем случае убрать пакеты, у которых размер...

207