2010-02-23 3 views
10

Je dois ouvrir un fichier en tant que std :: fstream (ou en fait tout autre std :: ostream) lorsque le nom de fichier est un nom de fichier "Unicode".Ouverture fstream avec fichier avec nom de fichier Unicode sous Windows utilisant un compilateur non MSVC

Sous MSVC j'ai non standard extension std::fstream::open(wchar_t const *,...)? Que puis-je faire avec d'autres compilateurs comme GCC (le plus important) et probablement le compilateur Borland.

Je sais que CRTL fournit _wfopen mais il donne C FILE * l'interface au lieu de flux io, peut-être il y a une manière non standard pour créer flux io de FILE *? Y at-il boost::ifstream avec MSVC comme extension pour Windows?

+0

Vous ne pouvez pas. Sur Mac OS X, il a été décidé que les API du fichier POSIX - et donc std :: fstream - prendraient toutes utf-8. Dans les environnements où il n'y a pas d'extensions spécifiques aux plates-formes (telles que gcc et bc sous Windows), les fonctions d'exécution de c & C++ ne peuvent pas être attendues de manière fiable (en fait, elles pourraient avoir leurs propres extensions, mais hors du standard POSIX). accéder aux fichiers donnés par le système de fichiers avec des caractères non ascii dans leur nom. –

+0

@Chris Je n'ai aucun problème avec la bibliothèque qui supporte UTF-8 - c'est parfait pour moi. Le problème que Windows ne prend pas en charge UTF-8 – Artyom

+0

une solution de contournement hackish pour MinGW est dans http://stackoverflow.com/questions/6524821/opening-stream-via-function – marcin

Répondre

3

Actuellement il n'y a pas de solution facile.

Vous devez créer votre propre tampon de flux utilisant _wfopen sous le capot. Vous pouvez utiliser pour cela par exemple boost::iostream

-3

Convertir le nom de fichier Unicode à une chaîne char* en utilisant quelque chose comme wcstombs() ou WideCharToMultiByte() (qui vous donne un contrôle beaucoup plus sur les pages de codes impliqués).

Ensuite, utilisez le nom de fichier converti pour ouvrir le fichier.

+4

Le nom de fichier inclut des caractères Unicode qui peuvent ne pas être représentés dans le courant codepage locale (ie les caractères hébreux ne peuvent pas être représentés dans les paramètres régionaux 8 bits de Latin1), Windows ne prend pas en charge les pages de codes UTF-8. Donc non, ça ne marche pas. – Artyom

7

Malheureusement, il n'y a pas de façon standard de le faire, bien que C++ 0x (1x?) Promet de le faire. Jusque-là, vous avez correctement supposé qu'une solution peut être trouvée dans Boost, cependant, la bibliothèque que vous recherchez est Boost.Filesystem.

Boost.Filesystem utilise en interne des chaînes étendues par défaut pour son système de chemin universel, il n'y a donc pas de problèmes Unicode à cet égard.

+0

Avez-vous une référence pour C++ 0X? Je me souviens des discussions mais pas de conclusion et je n'ai rien trouvé dans le dernier projet. – AProgrammer

+4

Le problème est le 'boost :: filesystem' ne supporte pas wpath sous MinGW/GCC parce que la configuration de boost définit' BOOST_NO_STD_WSTRING' pour une raison quelconque (même les chaînes larges fonctionnent assez bien sous mingw) – Artyom

+0

J'ai cherché un peu plus et trouvé ceci : http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454, apparemment pas de solution avant la bibliothèque TR2. – AProgrammer

Questions connexes