基于Visual Studio 2015 C++ Qt5读写中文路径和文件名的问题

需求描述:使用Qt进行中文路径和中文文件名的读写是很方便的,特别是在Qt5之后,但有时因为某些原因不方便使用Qt实现,还是需要用C++完成,以下总结了两种方法。

开发环境:win7/10;VS2010/2015;Qt4.8.6/5.7.1;CMake

方法一:针对win7+VS2010+Qt4

//用locale对象的name方法可以看到,通过locale("")构造出的locale 对象的name为"Chinese_People's Republic of China.936",
//而原始的locale对象的name为"C",也就是缺省的ANSI_C公约。
//注意:如果使用locale loc = locale::global(locale(""))设置全局locale后没有用 locale::global(loc)恢复的话,
//那么在程序后面的cout语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
//因为使用QString,所以对于QT还需设置其编码格式:在main.cpp中有	QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
/*
#include <locale>
*/

QString INPUT_FILE_PATH = tr("./中文路径/中文文件名.txt");
std::ifstream fp;

std::locale::global(std::locale(""));

fp.open( INPUT_FILE_PATH.toStdString().c_str(), std::ios::in );

std::locale::global(std::locale("C"));

if(!fp.is_open())
{
	return;
}
else
{...}

 方法二:针对win10+VS2015+Qt5

//在win10下,使用方法一失效,估计是win10语言环境与win7有区别:)
//以下方法是利用filesystem在vs2015(c++14)中的部分实现,结合Qt的基本功能,实现fstream文件读写。

/*
#include <filesystem>
*/

QString INPUT_FILE_PATH = "./中文路径/中文文件名.bin";
std::ifstream fp;

std::experimental::filesystem::path INPUT_FILE_PATH_U16STRING = INPUT_FILE_PATH.toStdU16String();

fp.open( INPUT_FILE_PATH_U16STRING, std::ios::in | std::ios::binary );

if(!fp.is_open())
{
	return;
}
else
{...}

 

posted @ 2021-03-20 21:55  JoyPoint  阅读(638)  评论(0编辑  收藏  举报