2010-04-26 11 views
8

Dal momento che Windows non ha una versione locale C++ con il supporto UTF-8 di default, mi piacerebbe costruire un oggetto locale personalizzata che supporta UTF8 (creando con un ctype sfaccettatura personalizzato).E 'possibile creare il proprio locale personalizzata

Come posso costruire un oggetto locale con una mia propria implementazione ctype (ho trovato solo le funzioni di costruire un locale utilizzando un locale già esistente come base di ..)

Se C++ non supporta la costruzione delle zone con un aspetto ctype personalizzato, perché è così?

+1

ctype non è compatibile con codifiche di lunghezza variabile come utf-8. Ad esempio, tolower() accetta e restituisce un singolo CharType. Ogni carattere al di fuori del sottoinsieme ASCII sarà quindi intraducibile dal ctype. –

+2

Vedere http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/codecvt.html. Anche Appendice D di Stroustrup, http://www.research.att.com/~bs/3rd_loc.pdf. E Standard C++ iostreams e locali http://books.google.fr/books?id=nnRog4I-3jwC – anno

+0

@anno: grazie tali link mi ha aiutato molto, +1 – smerlin

risposta

5

È possibile creare sfaccettature personalizzate ereditando da std :: locale :: facet. Le versioni locali possono utilizzare tali sfaccettature personalizzate come nel seguente codice:

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

accettato come risposta, anche se questo ha risposto alla mia domanda solo parzialmente, ma i link di annos mi hanno aiutato anche a me, quindi questa domanda è risolta per me. – smerlin

Problemi correlati