Qt与spdlog乱码问题如何彻底解决?

摘要:Qt使用spdlog输出日志 Qt 提供了 qInstallMessageHandler 函数,允许安装一个自定义的消息处理函数,以拦截和处理 Qt 的日志消息。可以利用这一功能,将日志写入文件。 可以在main文件中定义如下函数: #in
Qt使用spdlog输出日志 Qt 提供了 qInstallMessageHandler 函数,允许安装一个自定义的消息处理函数,以拦截和处理 Qt 的日志消息。可以利用这一功能,将日志写入文件。 可以在main文件中定义如下函数: #include <spdlog/spdlog.h> #include <spdlog/sinks/rotating_file_sink.h> //< 全局 spdlog logger std::shared_ptr<spdlog::logger> qtLogger; //< 自定义消息处理函数 void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { // 将 QString 转换为 UTF-8 编码的 std::string QByteArray byteArray = msg.toUtf8(); std::string utf8Msg(byteArray.constData(), byteArray.size()); switch (type) { //< 这里根据自己的需求可以将qt的 不同种类输出 重定向到 自己需要的日志输出接口中 case QtDebugMsg:{ qtLogger->debug(utf8Msg); spdlog::debug(utf8Msg); }break; case QtInfoMsg:{ qtLogger->info(utf8Msg); spdlog::info(utf8Msg); }break; case QtWarningMsg:{ qtLogger->warn(utf8Msg); spdlog::warn(utf8Msg); }break; case QtCriticalMsg:{ qtLogger->critical(utf8Msg); spdlog::critical(utf8Msg); }break; case QtFatalMsg:{ qtLogger->critical(utf8Msg); spdlog::critical(utf8Msg); }abort(); } } 之后可以在main函数中安装消息处理函数: try { #ifdef _WIN32 // 设置控制台代码页为 UTF-8 SetConsoleOutputCP(CP_UTF8); #endif // 初始化 spdlog qtLogger = spdlog::rotating_logger_mt("qt_logger", "SysManger.log", 1048576 * 5, 3); spdlog::set_level(spdlog::level::debug); spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v"); // 安装自定义消息处理函数 qInstallMessageHandler(customMessageHandler); // 示例日志输出 qDebug() << "这是一个调试信息"; qInfo() << "这是一个信息日志"; qWarning() << "这是一个警告信息"; qCritical() << "这是一个严重错误信息"; } catch (const spdlog::spdlog_ex &ex) { fprintf(stderr, "日志初始化失败: %s\n", ex.what()); return 1; } 此时就可以实现中文消息的重定向了,如果你设置了日志文件,则运行程序后会产生响应的日志文件及内容。 但是如果设置了控制台输出,并且使用qt的控制台的话会出现中文乱码的问题。 解决中文乱码 会出现中文乱码是因为qt的程序输出编码格式不是utf8,将qt的控制台输出设置成utf8即可。
阅读全文