Comment ouvrir un std :: fstream (ofstream ou ifstream) avec un nom de fichier unicode?

Vous n’imagineriez pas quelque chose d’aussi simple que d’ouvrir un fichier en utilisant la bibliothèque standard C ++ pour une application Windows était difficile … mais cela semble être le cas. Par Unicode, je veux dire UTF-8, mais je peux convertir en UTF-16 ou autre chose, le point est d’obtenir une instance en aval à partir d’un nom de fichier Unicode. Avant de pirater ma propre solution, existe-t-il une voie privilégiée ici? Surtout une plateforme multi-plateforme?

La bibliothèque standard C ++ n’est pas compatible avec Unicode. char et wchar_t ne sont pas obligatoirement des encodages Unicode.

Sous Windows, wchar_t est UTF-16, mais il n’y a pas de prise en charge directe des noms de fichiers UTF-8 dans la bibliothèque standard (le type de données char n’est pas Unicode sous Windows)

Avec MSVC (et donc Microsoft STL), un constructeur de filestreams est fourni avec un nom de fichier const wchar_t* , vous permettant de créer le stream en tant que:

 wchar_t const name[] = L"filename.txt"; std::fstream file(name); 

Cependant, cette surcharge n’est pas spécifiée par la norme C ++ 11 (elle garantit uniquement la présence de la version basée sur des caractères). Il n’est pas non plus présent sur les implémentations STL alternatives comme la libstdc ++ de GCC pour MinGW (-w64), à partir de la version g ++ 4.8.x.

Notez que, tout comme les caractères Windows sous Windows, UTF8, sur d’autres OS, wchar_t peut ne pas être UTF16. Donc, dans l’ensemble, ce n’est pas susceptible d’être portable. Ouvrir un stream avec un nom de fichier wchar_t n’est pas défini conformément à la norme, et il peut être difficile de spécifier le nom de fichier dans les caractères car l’encodage utilisé par char varie entre les OS.

Les versions actuelles de Visual C ++, le std :: basic_fstream, ont une méthode open() qui utilise wchar_t * selon http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx .

Utilisez std::wofstream , std::wifstream et std::wfstream . Ils acceptent le nom de fichier unicode. Le nom du fichier doit être wssortingng , array of wchar_t s ou il doit avoir la _T() ou le préfixe L avant le texte.

Regardez Boost.Nowide :

 #include  #include  using boost::nowide::ifstream; using boost::nowide::cout; // #include  // #include  // using std::ifstream; // using std::cout; #include  int main() { ifstream f("UTF-8 (eg ß).txt"); std::ssortingng line; std::getline(f, line); cout << "UTF-8 content: " << line; }