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

浙公網安備 33010602011771號