Bonjour tout le monde,
Vous êtes mon dernier espoir avant mon probable suicide du aux locales/encodages de caractères
Mon problème est simple :
Imaginons que j'ai un fichier dont le nom, ou le chemin, contienne des caractères non-ascii, par exemple du japonais, du grec, du russe ... Pour l'example on va dire que mon fichier s'appelle 疑問.dat.
Ce fichier est binaire, c'est simplement son chemin qui contient des caractères non-ascii. Sous Linux, si je fais :
std::ifstream ifs("疑問.txt"); et bien je peux ouvrir le fichier, aucun soucis. Dans ma vraie application, ce fichier est choisi par l'utilisateur par un file dialog (QFileDialog du framework Qt ). Je récupère en retour un QString nommé filepath, et en faisant simplement std::ifstream ifs(filepath.toUtf8()), ça fonctionne encore.
A mon avis ça marche car ma distribution Linux utilise par défaut l'UTF-8.
Le problème, c'est sous Windows, ou aucun des 2 streams construits au dessus ne permet d'ouvrir le fichier ! Je pense que c'est un problème de locale, apparemment ifs.getloc().name() retourne "C".
En fait j'ai beaucoup de mal à saisir tous les concepts de l'internationalisation en C++, les encodages, les locales, UTF-8 ... Pour résoudre un problème il faut déjà le comprendre, mais je ne suis pas sur de comprendre ce qu'il se passe ici
Faut il que je continue à utiliser un ifstream, ou bien un wifstream, ou passer par des wstring, wchar_t, ou essayer de changer la locale des stream, je n'en ai aucune idée ...
J'ai bien vu dans la FAQ une partie sur l'unicode, mais en fait le code ne semble pas compiler sous Visual C++ 2005, donc je n'ai pas pu tester.
Voilà, n'importe quel conseil, suggestion, aide, sera grandement apprécié !
Merci d'avance !
Partager