不知道 说什么好,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);