windows区域格式英文系统c++加载中文路径乱码问题

首先,参考这篇文章了解编码知识

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()//此函数将自动判断路径的/\正反。

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值