2010-04-26 2 views
8

Puisque Windows n'a pas de paramètres régionaux C++ avec le support UTF8 par défaut, je voudrais construire un objet local personnalisé qui supporte UTF8 (en le créant avec une facette ctype personnalisée).Est-il possible de créer vos propres locales personnalisées?

Comment puis-je construire un objet locale avec ma propre implémentation ctype (i seulement trouvé des fonctions de construire un lieu en utilisant une locale déjà existante en tant que base ..)

Si C++ ne prend pas en charge la construction de lieux avec une facette ctype personnalisée du tout, pourquoi est-ce le cas?

+1

ctype n'est pas compatible avec les encodages de longueur variable comme utf-8. Par exemple, tolower() prend et renvoie un seul CharType. Tout caractère en dehors du sous-ensemble ASCII sera donc intraduisible par ctype. –

+2

Voir http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/codecvt.html. Aussi Stroustrup Annexe D, http://www.research.att.com/~bs/3rd_loc.pdf. Et C++ IOStreams standard et locales http://books.google.fr/books?id=nnRog4I-3jwC – anno

+0

@anno: merci ces liens m'a aidé beaucoup, +1 – smerlin

Répondre

5

Il est possible de créer des facettes personnalisées en héritant de std :: locale :: facet. Les paramètres régionaux peuvent utiliser ces facettes personnalisées comme suit:

class custom_facet : public std::locale::facet { 
public: 
    static std::locale::id id; 
    custom_facet(int); 
    int custom_value() const; 
    }; 

std::locale custom_locale (std::locale(), new custom_facet()); 
int s = std::use_facet<custom_facet>(custom_locale).custom_value(); 
+0

accepté comme réponse, même si cela n'a répondu que partiellement à ma question, mais annos links m'a aidé aussi, alors cette question est résolue pour moi. – smerlin

Questions connexes