C++中文路径解决方案(2023亲测有效)

中文路径使用有问题的原因:

使用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

但是,在桌面上查看文本文件的时候,发现文件名称是乱码:

2f69c78fe2596f303ddfbd7a0720ae88.png

乱码原因

不严谨的说法就是代码源码中的路径字符编码系统读取路径时默认的编码不一致导致乱码。国内一般的Windows系统默认编码是gbk,而c++常用的IDE默认编码一般是utf-8。常见的乱码一般都是这个原因。

解决方法

思路:
  1. 将系统的默认编码改为gbk。
  2. 或者将源码保存为系统默认编码(一般是gbk)。
  3. 在进行io操作前(传入路径字符串参数前)将字符串的编码由utf-8转换为系统默认编码。
  4. 使用第三方库如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

方法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;
}

 

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值