首先,参考这篇文章了解编码知识
https://blog.csdn.net/qq_40321622/article/details/130865634
先说结论
电脑语言的区域格式设置为英文后,系统默认编码不再是gbk,可通过cmd属性查看代码页,我的是oem437,也就是窄字符(应该无论如何也无法保存中文)。但是此时可以把文件夹路径设为中文,这个中文编码验证应该是utf8。如果我们c++加载一段中文字符串路径,解析字符集,最终要还原显示这些二进制字节编码的时候,个人推测在某一阶段转为了oem,从而丢失信息。因此解决方案就是首先确保字符串为u8编码,(u8“”).然后设置setlocale(LC_ALL,“.UTF-8”);作用就是让当前程序解析使用u8,但是值的注意的是,输出到控制台的字仍然无法用,但是可以加载了。(这里无法用的意思是,我们通过cmd的dir输出一个中文路径,虽无法显示,但是复制到记事本不会乱码,但是我们程序输出的仍然乱码)程序cout和printf输出的似乎也有区别,最好用printf输出。
可以通过此方式查看字符编码
std:: string inputString = u8"D:\中.png";
for (char c : (inputString)) {
std::bitset<8> binaryRepresentation©; // 将字符转换为8位二进制表示
std::cout << binaryRepresentation.to_string() << " "; // 输出二进制表示
}
通过此网站比对https://www.qqxiuzi.cn/bianma/zifuji.php
如果不是怎么转为u8?
1、Qt方式
QTextCodec* uuu = QTextCodec::codecForName(“UTF-8”);
QByteArray arr = uuu->fromUnicode(string);
2、windows函数
std::string UTF8_To_string(const std::string& str)
{
int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1]; //一定要加1,不然会出现尾巴
memset(pwBuf, 0, nwLen * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string strRet = pBuf;
delete[] pBuf;
delete[] pwBuf;
pBuf = NULL;
pwBuf = NULL;
return strRet;
}
WideCharToMultiByte第一个参数改掉就可以转为你想要的其他类型。
3、Qt 其他函数
/ m_fontPath.toStdString();因为qstring就是u8,此方式会默认转为u8.
还有m_fontPath.toUtf8()
m_fontPath.toLocal8Bit()
QFile::encodeName()(内部也会调m_fontPath.toLocal8Bit())
QDir::toNativeSeparators()//此函数将自动判断路径的/\正反。