中文路径使用有问题的原因:
使用ofstream在桌面创建一个中文名称的文本文件,例如“你好.txt”:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char* x = wchar2char(L"C:\\users\\arcueidbrunestud\\desktop\\你好.txt");
ofstream ofs(x);
if (ofs.is_open()) printf("true\n");
else printf("false\n");
return 0;
}
运行的结果自然是true,可以创建中文名称的文本文件:
![471e39efc2ef1bb1dd08fcab2959b3f6.png](https://img-blog.csdnimg.cn/img_convert/471e39efc2ef1bb1dd08fcab2959b3f6.png)
但是,在桌面上查看文本文件的时候,发现文件名称是乱码:
![2f69c78fe2596f303ddfbd7a0720ae88.png](https://img-blog.csdnimg.cn/img_convert/2f69c78fe2596f303ddfbd7a0720ae88.png)
乱码原因
不严谨的说法就是代码源码中的路径字符编码和系统读取路径时默认的编码不一致导致乱码。国内一般的Windows系统默认编码是gbk,而c++常用的IDE默认编码一般是utf-8。常见的乱码一般都是这个原因。
解决方法
思路:
- 将系统的默认编码改为gbk。
- 或者将源码保存为系统默认编码(一般是gbk)。
- 在进行io操作前(传入路径字符串参数前)将字符串的编码由utf-8转换为系统默认编码。
- 使用第三方库如qt等进行io操作。
解决示例
方法1:windows下,无需第三方库
使用头文件:
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
首先定义把wchar转char的函数:
char* wchar2char(const wchar_t* wchar)
{
char* m_char;
int len = WideCharToMultiByte(CP_ACP, 0, wchar, -1, NULL, 0, NULL, NULL);
m_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, wchar, -1, m_char, len, NULL, NULL);
m_char[len] = '\0';
return m_char;
}
进行读写包含中文路径的操作时,使用如下格式(注意字符串前的L):
int main(){
char* x = wchar2char(L"C:\\users\\arcueidbrunestud\\desktop\\你好.txt");
ofstream ofs(x);
if (ofs.is_open()) printf("true\n");
else printf("false\n");
return 0;
}
运行结果:
![471e39efc2ef1bb1dd08fcab2959b3f6.png](https://img-blog.csdnimg.cn/img_convert/471e39efc2ef1bb1dd08fcab2959b3f6.png)
方法2:使用Qt
引入头文件:
#include <iostream>
#include <fstream>
#include <QtCore/qtextcodec.h>
using namespace std;
进行读写包含中文路径的操作时,使用如下格式(注意字符串前的L):
int main(){
QTextCodec* codec = QTextCodec::codecForName("gbk");
string x = codec->fromUnicode(L"C:\\users\\arcueidbrunestud\\desktop\\你好.txt").toStdString();
ofstream ofs(x);
if (ofs.is_open()) printf("true\n");
else printf("false\n");
return 0;
}