Подскажите пожалуйста, как можно добавить поддержку русского языка в приложение QT. Пишу в Visual Studio (так как с QT Creator не разобрался, траблы с дебагером).
Нужно что бы можно было обьявить переменную и занести в нее русский текст:
QString var = "Привет!";
Пробовал такой код:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
Если заношу текст в QByteArray
, то все нормально, но я не могу с ним работать, мне далее нужно будет сравнивать строки. Если конвертирую в utf-8, то все равно кракозябра.
Подскажите пожалуйста, как можно это реализовать.
Должен работать вариант QString::fromLocal8Bit()
, где локаль можно установить при помощи функции QTextCodec::setCodecForLocale()
и QTextCodec::codecForName()
, передав в последнюю Windows-1251:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
QString cyrillicName = QString::fromLocal8Bit("словоНаКириллице");
Обратите внимание на то, что QString
использует utf-16
, поэтому прямое копирование байтов в QString (например, через QByteArray
) может давать не те результаты.
Если вы хотите прямо в исходном коде строку задать, то можно 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 внутри, то такой код занимается ненужными преобразованиями текста из одной кодировки в другую.
Просто сохраняйте исходники в utf8 и используйте
QString var = QString::fromUtf8("Привет!");
Не очень удобно, но работает.
Еще можно префикс u из c++11 применить, особенно если исходники не в utf8:
auto var = QString::fromUtf8(u"Привет!");
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени суток! Никак не могу понять, как отфильтровать трафик в winpcap по размеру пакета(в моем случае убрать пакеты, у которых размер...