Rozważmy następujący kod:Otwarte utf8 zakodowane nazwy pliku w C++ Okna
#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;
}
Jeżeli używam pliku, nie można otworzyć w ten sposób plik wejściem do bloku else
. Nawet używanie boost::locale::conv::from_utf(utf8path ,"utf_8")
zamiast utf8path
nie działa. Kod działa, jeśli rozważam użycie parametru wifstream
i użycie parametru wfilename
jako jego parametru, ale nie chcę używać wifstream
. Czy istnieje sposób, aby otworzyć plik o nazwie kodowanej utf8
? Używam Visual Studio 2010
.
Żadne z bazowych interfejsów API systemu Windows nie używają UTF8. std :: ifstream w końcu wywoła CreateFileA lub CreateFileW, aby otworzyć plik, po czym te funkcje przyjmują UTF8. –
Więc jeśli mam zamiar użyć 'ifstream', jak powinienem zmienić kod aby działał. Powinienem używać 'wstring'a – Pant
Chodzi o to, że próbuję zrobić kod na platformie. Ponieważ Linux jest już świadomym unicode, kod powinien prawdopodobnie działać, jeśli użyję 'ifstream'. Jak mam sobie z tym poradzić? – Pant