LINUX.ORG.RU

qDebug() и кириллица

 , ,


0

1

Как заставить выводить кириллицу, а не кракозябры?

#include <QtCore>

int main(int argc, char **argv)
{
    QFile file("file.data");

    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << QString("здесь кракозябры");
    }

    return 0;
}
Есть ли другой способ вывода на консоль, без кавычек, как выводит qDebug()? Или надо перенаправлять в std::cout?

★★★★

Вопрос на засыпку: а в какой кодировке этот код?

asaw ★★★★★
()
    QApplication app(argc,argv);
// или QCoreApplication 
// настройка кодека для корректной обработки русских букв
    QTextCodec *codec1 = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec1);
    QTextCodec::setCodecForTr(codec1);
    QTextCodec::setCodecForCStrings(codec1);


MikeDM ★★★★★
()

1. qPrintable() для этих целей.

2. QTextStream out(stdout); out << «Whatever» << endl;

schizoid ★★★
()

плохой, негодный код.

вот так правильно:

#include <QtCore>

int main(int argc, char **argv)
{
    QFile file("file.data");

    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << QString("There are crackozyabrows here.");
    }

    return 0;
}

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

а почему не так? может русский язык действительно требуется.

#include <QtCore>
class MainLang: public QObject {};
int main(int argc, char **argv) {
    QFile file("file.data");
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << MainLang::tr("There are crackozyabrows here.");
    }
    return 0;
}

anonymous
()
Ответ на: комментарий от asaw

Код в кодировке utf8, QLatin1String не взлетело, qPrintable() не взлетело, fromUtf8 не взлетело, toUtf8 не взлетело, QTextCodec еще не пробовал.

Qt 4.8.2, Debian Wheezy

Кириллица нужна обязательно.

class MainLang: public QObject {}; - в чем тут соль?

WRG ★★★★
() автор топика
Ответ на: комментарий от WRG

QTextCodec тоже не взлетело, ну что ж такое. Чем то не хорошим тут попахивает...

не осилишь, черкни на почту. может чем помогу.

MikeDM ★★★★★
()
Ответ на: комментарий от WRG

Это нужно делать, естественно, до выполнения других операций. После создания QCoreApplication. Он вообще создаётся?

Y ★★
()
Последнее исправление: Y (всего исправлений: 1)
Ответ на: комментарий от asaw

глупо, но попробовал от безысходности)

#include <QtCore>
#include <QApplication>
#include <QObject>
class MainLang: public QObject {};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QTextCodec *codec1 = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec1);
    QTextCodec::setCodecForTr(codec1);
    QTextCodec::setCodecForCStrings(codec1);

    QTextStream out(stdout);
    QFile file("file.data");

    if(!file.open(QIODevice::ReadOnly))
    {
        out << QString().fromUtf8("азаза\n");
    }

    return app.exec();
}

app создаётся, далее как посоветовали. выводит пустую строку, если убрать \n и её не выводит.

WRG ★★★★
() автор топика
Ответ на: комментарий от asaw

Там написано introduced in Qt5. У меня 4.8.2

WRG ★★★★
() автор топика
Ответ на: комментарий от WRG

class MainLang: public QObject {}; - в чем тут соль?

прошу прощения, не правильно написал. ниже приведен корректный код:

#include <QtCore>
#include <QTranslator>
int main(int argc, char **argv) {
    QFile file("file.data");
    QTranslator t;
    t.load(":/project.qm");
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << t.translate("main","There are crackozyabrows here.");
    }
    return 0;
}
$ lupdate -recursive -extensions qs,js,ui,cpp,h,qml . -ts project.ts
$ linguist project.ts
project.pro:
...
RESOURCES += \
    project.qrc:
project.qrc:
<RCC>
    <qresource prefix="/">
        <file>project.qm</file>
    </qresource>
</RCC>

anonymous
()

Интересно что будучи без каких-либо изменений скомпилированным последним шлангом на макоси с qt5 сабж работает как нужно автору. Рукалитсо.

asaw ★★★★★
()
Ответ на: комментарий от Kosyak

ru_RU.UTF-8

решение найдено, надо юзать printf(«%s\n»,QString(«ололо»).toStdString().c_str()); такие дела.

QObject::trUtf8

гляну, что это такое.

WRG ★★★★
() автор топика
#define Utf QTextCodec::codecForLocale()->toUnicode [br]
qDebug()<<Utf(«бла-бла-бла»);

define - для удобства, если часто использоваться будет.

Sakura
()
Ответ на: комментарий от Sakura

QTextCodec::codecForLocale()->toUnicode

Херня. Исходники же далеко не в локальной кодировке, а конкретно в UTF-8.

Kosyak ★★★★
()
Ответ на: комментарий от WRG

Попробуй-ка этот тестик запустить:

#include <QtCore>
#include <QApplication>
#include <QObject>
#include <iostream>

int main(int argc, char **argv)
{
    qDebug() << QString::fromUtf8("азаза один");
    setlocale(LC_ALL, "");
    qDebug() << QString::fromUtf8("азаза два");
    QApplication app(argc, argv);
    qDebug() << QString::fromUtf8("азаза три");
    std::cout << QString::fromUtf8("азаза четыре").toLocal8Bit().data() << std::endl;
    std::cout << QString::fromUtf8("азаза пять").toUtf8().data() << std::endl;
    
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    
    qDebug() << QString::fromUtf8("азаза шесть");
    qDebug() << QString("азаза семь");
    qDebug() << QString::fromLocal8Bit("азаза восемь");

    return app.exec();
}

Kosyak ★★★★
()

Есть ли другой способ вывода на консоль, без кавычек, как выводит qDebug()

я использую такую «базовую» функцию для вывода сообщений на консоль (+шаблоны на несколько параметров, +define для удобства)

QString consoleWrite(const QString& message)
{
	QString mess = QString("%1 %2\n").arg( QDateTime::currentDateTime().toString("hh:mm:ss")).arg(message);
	QTextStream ts(stderr);
	ts << mess;
	return mess;
}

// ...
DLOG("some debug: %1 %2", i_val, string_val);

x905 ★★★★★
()
Ответ на: комментарий от Kosyak

" " «азаза два» «азаза три» азаза четыре азаза пять «азаза шесть» «азаза семь» «азаза восемь»

anonymous
()
Ответ на: комментарий от anonymous

И кстати, у меня, если сделать

#include <QtCore>
#include <QApplication>
#include <QObject>
#include <iostream>

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "");
    qDebug() << QString::fromUtf8("азаза два");
    QApplication app(argc, argv);
    qDebug() << QString::fromUtf8("азаза три");
    std::cout << QString::fromUtf8("азаза четыре").toLocal8Bit().data() << std::endl;
    std::cout << QString::fromUtf8("азаза пять").toUtf8().data() << std::endl;
    
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    
    qDebug() << QString::fromUtf8("азаза шесть");
    qDebug() << QString("азаза семь");
    qDebug() << QString::fromLocal8Bit("азаза восемь");
    qDebug() << "Гном говно\n";

    return app.exec();
} 

Даже

qDebug() << "Гном говно\n";
нормально работает.

anonymous
()
Ответ на: комментарий от anonymous

Оно так и должно быть. Я просто хотел проверить, может у ТС какие-то проблемы с локалью или кодеками у кутей.

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

есть определённые результаты

вот выхлоп

" " 
"азаза два" 
"азаза три" 
"азаза шесть" 
"азаза семь" 
"азаза восемь" 
азаза четыре
азаза пять
делаю вывод, что завелось после пинка
setlocale(LC_ALL, "");

попробовал на другом компе, результат такой же.

WRG ★★★★
() автор топика
Ответ на: комментарий от WRG

Кириллица нужна обязательно.

В qDebug? Ты точно уверен, что понимаешь, для чего нужна эта функция?

Все места, где кириллица ДЕЙСТВИТЕЛЬНО нужна, надо заключать в tr(), а саму кириллицу локализовать в .ts.

fromUtf8, вообще-то, должен был взлететь, если файл действительно в этой кодировке, и обратное не задано кодеками.

Но отладочные сообщения, для коих применяется qDebug, вообще-то, проще просто писать латиницей.

И не вздумай использовать qDebug для штатного вывода на консоль. Это совсем другая задача.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

И не вздумаю. Поэтому и спрашиваю, чем его заменить, потому как мне надо бы выводить кириллицу на консоль. Теперь наклёвывается куча вариантов, они есть выше. Скорее всего заюзаю std::cout из всех предложенных.

WRG ★★★★
() автор топика
Ответ на: комментарий от WRG

Скорее всего заюзаю std::cout из всех предложенных.

Это правильно.

Причём скорее всего, применять его надо в сочетании с toLocal8Bit() - а то целевых систем много, и далеко не во всех из них системная локаль это юникод...

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Благодарю за совет, опробую.

WRG ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.