Проблема в том, что метод operator<<(const char *)
ожидает строку в кодировке Latin1, поэтому вы должны передать правильный UTF-8 QString
в QDebug
, например:
qDebug() << QString::fromUtf8("我");
...и изнутри обработчик сообщений ожидает строку UTF-8:
QString message = QString::fromUtf8(msg);
И это должно работать как шарм.;)
Для получения дополнительной информации, пожалуйста, прочитайте справочное руководство QDebug .
Вы также можете поступить неправильно: продолжайте передавать кодированные строки UTF-8 через <<
ипреобразовать строки с помощью ужасного вызова QString::fromUtf8(QString::fromUtf8(msg).toAscii().constData())
.
Редактировать: Это последний пример, который работает:
#include <QString>
#include <QDebug>
#include <QMessageBox>
#include <QApplication>
void
myMessageOutput(QtMsgType type, const char *msg)
{
QMessageBox::information(NULL, NULL, QString::fromUtf8(msg), QMessageBox::Ok);
}
int
main(int argc, char *argv[])
{
QApplication app(argc, argv);
qInstallMsgHandler(myMessageOutput);
qDebug() << QString::fromUtf8("我");
return 0;
}
Обратите внимание, что QDebug
не делаетне выполнять преобразование кодировки, если вы не создаете экземпляр QApplication
.Таким образом, вам не нужно делать ничего особенного для msg
из обработчика сообщений, но я STRONGLY рекомендую вам создать его экземпляр.
Одна вещь, которую вы должны быть уверены, это то, чтоВаш файл исходного кода кодируется в UTF-8.Для этого вы можете использовать соответствующий инструмент для проверки (например, file
в случае использования Linux) или просто позвонить QMessageBox::information(NULL, NULL, QString::fromUtf8("我"), QMessageBox::Ok)
и посмотреть, появляется ли правильное сообщение.