Ne marche que sous Linux, car sous Windows ne convertit pas en UTF-8 comme je le voudrais![]()
Ne marche que sous Linux, car sous Windows ne convertit pas en UTF-8 comme je le voudrais![]()
Arf, ça donne quoi sous Windows ?
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Pour moi ça code en ANSI, mais j'ai des accents tout bien mais ce n'est pas de l'UTF-8 or pour mon appli l'encodage de référence est l'UTF-8Mais au moins maintenant je n'ai plus besoin de forcer l'encodage de mon fichier XML en UTF-8, je peux le mettre en ce que je veux, car je transforme toutes les chaîne en UTF-8 dans le code
Donc ce n'est pas trop graveen tout cas j'ai noté la méthode le jour ou je voudrais faire une appli avec des soucis d'encodage exclusivement sous Linux
![]()
mais pour transformer une chaine en UTF-8 il faut savoir l'encodage de ton fichier non? sinon Qt ne va pas non plus reussir, il prend par default l'encodage de l'OS. A noter que QApplication est absolument necessaire ici car sinon la conversion n'est pas correcte.
Sous windows, ca ne marche pas sauf si on mets:
avant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part setlocale(LC_ALL, "");
Ensuite:
marche (l_loc.name() == "C"), la conversion est correcte
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::locale l_loc;
marche, mais seulement sous visual studio, sous gcc cette locale n'existe pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::locale l_loc("Swedish_Sweden.1252");
marche, mais la conversion est incorrecte (
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::locale l_loc("Thai_Thailand.874");
test des caractères suédois: åöä
test des caract?res su?dois: ???
)
Et personne ne tente UTF8CPP? Juste pour voir? Parceque je vois pas en quoi ça résouds pas le problème...
a part manipuler les chaines UTF8, est ce que UTF8CPP peut traduire d'une chaîne ASCII d'encodage courant vers UTF-8? je n'ai pas vu ca.
Car c'est bien la le problème: comment passer de l'encodage courant (qui peut etre UTF-8, suédois, thailandais, etc etc) a un encodage unicode. Passé ce point, UTF8CPP ou n'importe quelle bibliothèque Unicode est parfaite.
C'est d'ailleurs a ce moment que Qt est devenu interessant.
ce que je ne comprends pas, c'est qu'on veut transformer de l'XML en UTF-8
la solution trouvé est Qt, pas iconv car il faut specifier l'encodage source.
ce que je ne comprends pas, c'est que Qt fait la meme chose, sauf qu'il prend par default l'encoding par default du system. Est-ce voulu comme ca?
Ca ne me semble pas consistent comme solution.
UTF8CPP ne me convient pas du tout car elle ne permet pas de convertir une chaîne encodé dans n'importe quel encodage en UTF-8.
Ensuite epsilon j'ai l'impression que tu n'as pas bien compris quel était mon but, regarde mon premier post je pense qu'une fois que tu l'auras lu tu comprendras mieux![]()
oui tu as raison, j'avais mal compris.
cependant, en fouillant dans la doc de ICONV, en passant "" dans "from_locale",
tu obtiens la locale courante.
En faisant une recherche sur la conversion ASCII => UTF-8, je suis tombé sur le blog d'Emmanuel Deloget qui définit la fonction suivate :
ça utilise la facette codecvt, qui permet normalement une meilleure conversion que ctype (celle que j'utilisais). Par contre il faut définir une locale en début de programme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 std::wstring s2w( const std::string & s, const std::locale & loc = std::locale()) { typedef std::codecvt <wchar_t, char, std::mbstate_t> facet_type; typedef facet_type::result result_type; std::mbstate_t state = std::mbstate_t(); result_type result; std::vector <wchar_t> buffer( s.size()); const char * end_in_ptr = NULL; wchar_t * end_out_ptr = NULL; result = std::use_facet<facet_type>( loc).in( state, s.data(), s.data() + s.length(), end_in_ptr, & buffer.front(), & buffer.front() + buffer.size(), end_out_ptr ); return std::wstring( & buffer.front(), end_out_ptr); }
Voilà le lien vers la page du blog : http://blog.emmanueldeloget.com/inde...ationalisation
Par contre, au niveau de l'écriture dans un fichier en UTF-8, tu utilises std::ofstream ou FILE ? Parce qu'avec FILE, pour écrire en UTF-8 il faut ouvrir ton fichier avec comme mode "w, ccs=UTF-8".
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Très intéressant cette fonctionmais malheureusement marche pas avec visual studio mais juste avec MinGW (GCC)
Ce qui est d'ailleurs bien expliqué dans l'article :
Donc vue que la solution ne marche pas avec tout (donc pas portable) elle ne me convient pas pour ce que j'ai à faire.les conversions qui sont effectuées sont limitées par les outils installés sur le système d'exécution (c'est à dire par les locales connues). Selon l'OS, le compilateur, etc. , le nombre de locale connues peut être relativement réduit, ce qui risque de poser des problèmes de conversion dans certains cas.
Mais je la garde dans un coin de toute façonmerci
![]()
Euh ... Tu as quelle version de Visual Studio ? Parce que chez moi ça semble aller. Qu'entends-tu par 'ne marche pas' ? Ne compile pas ou ne fait pas la conversion correctement ?
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
2010, et mon éditeur de texte me dit que ce n'est pas de l'utf-8 qui est écrit dedans.
Tu sais le pur portable, ça n'existe pas trop... les outils modernes de compilation permettent de facilement faire de petites adaptations en fonction du compilateur. Quand tu veux faire du multi-plateforme, il est rare d'y couper.
Typiquement, ça pourrait fonctionner dans Visual avec le bon nom de locale. Il suffirait de faire faire par les outils un #define qui choisi la bonne.
Entre utiliser Qt et faire un petit tout de passe-passe qui choisi la bonne locale en fonction du compilateur, je préfère personnellement cette deuxième solution...
Je sais que ça n'existe pas trop c'est pour cette raison que je prend la solution qui s'en rapproche le pluscar au moins je suis sur que peut importe l'OS le comportement sera le même.
Partager