基于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 {...}