无语啊 c++ loguru日志模块不支持utf-8的原因竟然是...

不知道 说什么好,c++琢磨了好久,全网都没有答案,反正写入日志永远是ansi。

最后终于总结出,原因竟然是项目名称是中文

原因如下:

loguru先要写日志,

2024-06-13 07:23:52.185 (   0.011s) [main thread     ]             项目名.cpp

不管要写入的信息是什么,它在此之前,要记录时间和项目名,因为项目名是其它地方获取到的非utf-8的非ascii字符的中文,所以它为了不乱码,就把文件格式改为了ANSI格式的文本文件。

后面就混乱了,

解决办法就是,把项目名改成英文,把要写入的日志文本,先转化成utf-8 编码的string。

(这办法好像挺low的,还有种高大上的,通过fmt模块,修改loguru日志格式,把其中中文文件名部分去掉或者改成别的,或者先转换成utf-8编码的?越说越高档的感觉。反正我还不会。)

ansi编码的 std::string 格式转换为 utf-8编码的std::string的代码如下:

#include <string>
#include <windows.h>

// 将 std::wstring 转换为 UTF-8 编码的 std::string
std::string wstring_to_utf8(const std::wstring& wstr) {
    if (wstr.empty()) return std::string();

    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}

// 将 UTF-8 编码的 std::string 转换为 std::wstring
std::wstring utf8_to_wstring(const std::string& str) {
    if (str.empty()) return std::wstring();

    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}
// 将 Ansi 编码的 string 转换为 utf-8 编码的 string
std::string ansi_to_utf8(const std::string& ansiStr) {
    if (ansiStr.empty()) return std::string();

    // 将 Ansi 转换为 wstring
    int sizeNeeded = MultiByteToWideChar(CP_ACP, 0, &ansiStr[0], (int)ansiStr.size(), NULL, 0);
    std::wstring wstrTo(sizeNeeded, 0);
    MultiByteToWideChar(CP_ACP, 0, &ansiStr[0], (int)ansiStr.size(), &wstrTo[0], sizeNeeded);

    // 将 wstring 转换为 utf-8
    return wstring_to_utf8(wstrTo);

下面代码跟上方文本一毛一样。随便取一个即可。

#include <string>
#include <windows.h>

// 将 std::wstring 转换为 UTF-8 编码的 std::string
std::string wstring_to_utf8(const std::wstring& wstr) {
    if (wstr.empty()) return std::string();

    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}

// 将 UTF-8 编码的 std::string 转换为 std::wstring
std::wstring utf8_to_wstring(const std::string& str) {
    if (str.empty()) return std::wstring();

    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}
// 将 Ansi 编码的 string 转换为 utf-8 编码的 string
std::string ansi_to_utf8(const std::string& ansiStr) {
    if (ansiStr.empty()) return std::string();

    // 将 Ansi 转换为 wstring
    int sizeNeeded = MultiByteToWideChar(CP_ACP, 0, &ansiStr[0], (int)ansiStr.size(), NULL, 0);
    std::wstring wstrTo(sizeNeeded, 0);
    MultiByteToWideChar(CP_ACP, 0, &ansiStr[0], (int)ansiStr.size(), &wstrTo[0], sizeNeeded);

    // 将 wstring 转换为 utf-8
    return wstring_to_utf8(wstrTo);

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值