Si consideri il seguente codice:Aprire utf8 codificato il nome del file in C++ di 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;
}
Se si esegue il file, non posso aprire il file entrando così nel blocco else
. Anche l'utilizzo di boost::locale::conv::from_utf(utf8path ,"utf_8")
invece di utf8path
non funziona. Il codice funziona se considero l'utilizzo di wifstream
e l'utilizzo di wfilename
come parametro, ma non desidero utilizzare wifstream
. C'è un modo per aprire il file con il suo nome codificato utf8
? Sto usando Visual Studio 2010
.
Nessuna delle API di Windows sottostanti utilizza UTF8. std :: ifstream alla fine chiamerà CreateFileA o CreateFileW per aprire il file, il nether di queste funzioni prende UTF8. –
Quindi, se ho intenzione di usare 'ifstream', come dovrei cambiare il codice per farlo funzionare. Dovrei usare 'wstring' – Pant
Il fatto è che sto cercando di rendere il codice multipiattaforma. Dato che Linux è già sensibile all'unicode, il codice dovrebbe funzionare se uso 'ifstream'. Come dovrei affrontare questa situazione? – Pant