考慮下面的代碼:在C編碼的文件名打開UTF8 ++的Windows
#include <iostream>
#include <boost\locale.hpp>
#include <Windows.h>
#include <fstream>
std::string ToUtf8(std::wstring str)
{
std::string ret;
int len = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0, NULL, NULL);
if (len > 0)
{
ret.resize(len);
WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), &ret[0], len, NULL, NULL);
}
return ret;
}
int main()
{
std::wstring wfilename = L"D://Private//Test//एउटा फोल्दर//भित्रको फाईल.txt";
std::string utf8path = ToUtf8(wfilename);
std::ifstream iFileStream(utf8path , std::ifstream::in | std::ifstream::binary);
if(iFileStream.is_open())
{
std::cout << "Opened the File\n";
//Do the work here.
}
else
{
std::cout << "Cannot Opened the file\n";
}
return 0;
}
如果我正在運行的文件,我不能打開這樣的文件進入else
塊。即使使用boost::locale::conv::from_utf(utf8path ,"utf_8")
而不是utf8path
也不起作用。如果我考慮使用wifstream
並使用wfilename
作爲參數,代碼將起作用,但我不想使用wifstream
。有沒有辦法打開它的名字utf8
編碼的文件?我正在使用Visual Studio 2010
。
沒有底層的Windows API使用UTF8。 std :: ifstream最終將調用CreateFileA或CreateFileW來打開該文件,而這些函數的其他功能則採用UTF8。 –
所以,如果我要使用'ifstream'我應該如何改變代碼來使它工作。我應該使用'wstring' – Pant
問題是我試圖讓代碼跨平臺。由於Linux已經知道unicode,所以如果我使用'ifstream',代碼應該可以工作。我應該如何處理這種情況? – Pant