Qt qInstallMessageHandler 编码

Lob*_*ter 1 c++ qt

当我通过qInstallMessageHandler函数实现我的自定义日志处理程序时,调试日志中的俄语文本有问题。目前,我的代码是:

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) {

    QByteArray localMsg = msg.toLatin1();

    QString stringType;
    switch (type) {
    case QtDebugMsg:
        stringType = "D";
        break;
    case QtWarningMsg:
        stringType = "W";
        break;
    case QtCriticalMsg:
        stringType = "C";
        break;
    case QtFatalMsg:
        stringType = "Fatal";
        break;
    default:
        stringType = "Unknown";
    }

    QString logString = QString("[%1] %2:%3 - %4\n")
            .arg(stringType)
            .arg(context.function)
            .arg(context.line)
            .arg(localMsg.constData());

    if (__logFile.isOpen()) {
        QTextStream stream(&__logFile);
        stream << logString;
    }

    QTextStream stderrStream(stderr, QIODevice::WriteOnly);

    stderrStream<<logString;

    if (type == QtFatalMsg) {
        abort();
    }
} 
Run Code Online (Sandbox Code Playgroud)

main()功能上:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
createLogFile();

qInstallMessageHandler(myMessageOutput);

qDebug()<<"Hi ??????";
Run Code Online (Sandbox Code Playgroud)

但不是“嗨??????” 我有

[D] int main(int, char**):131 - 你好??????

在 qt 创建者日志中。我尝试使用 Windows-1251 编解码器,但它没有改变任何东西。

MrE*_*Sir 5

问题在这里:

QByteArray localMsg = msg.toLatin1();
Run Code Online (Sandbox Code Playgroud)

引用QString::toLatin1() 的文档

以 QByteArray 形式返回字符串的 Latin-1 表示形式。

如果字符串包含非Latin1 字符,则返回的字节数组未定义。这些字符可能会被隐藏或替换为问号

强调我的。

好消息是您没有理由需要调用此方法。在这里完全不需要将 msg 的内容从 QString 转换为 QByteArray。