-
Notifications
You must be signed in to change notification settings - Fork 16
/
locale.txt
189 lines (163 loc) · 12 KB
/
locale.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
LOCALE
UTILISATION BASIQUE ==> # - std::locale::global( std::locale( "" ) ); // Fait que std::locale() a la locale courante
# typedef char char_type; //Utiliser le char_type du système
# if ( std::has_facet<std::numpunct<char_type> >( std::locale() ) ) // Ou std::locale( "" ) si pas
# sûr que locale::global() a
# été bien appelé
# {
# const std::numpunct<char_type>& MyFacet = std::use_facet<std::numpunct<char_type> >
# ( std::locale() ); //Ou directement via une variable temporaire
# std::cout << MyFacet.truename() << "\n";
# }
#De plus, si utilisation de std::cout, cin, cerr ou clog, toujours faire un imbue.
HEADER ==> #<locale>
LOCALE ET FACET ==> #Une locale est une langue/région + charset.
#Une facet est une policy class associant les méthodes pour une action donnée. L'implémentation de ses
#méthodes dépend d'une locale.
#Utilisent par défaut la LOCALE à laquelle ils sont associés les streams et std::string notamment :
# - ISTREAM >> VAL (num_get)
# - OSTREAM << VAL (num_put)
# - ISTREAM >> DATE, TIME,etc. (boost::date_time facet)
# - OSTREAM << DATE, TIME,etc. (boost::date_time facet)
# - ISTREAM >> PATH (codecvt)
# - OSTREAM << PATH (codecvt)
# - PATH( ARGS ) (codecvt)
# - STRING.compare(), lexicographical_compare(), comparaisons de PATH (collate)
#Toute classe utilisant les LOCALE, lors de son instantation est associée à la locale globale
#courante (par défaut "C").
#Il suffit donc de faire :
# - std::locale::global( std::locale( "" ) );
#au début d'un programme pour que les objets suivants le prennent en compte.
#imbue() et locale prennent FACET par référence : ainsi, pas besoin de refaire imbue(), il suffit de
#changer facet()
#Attention : std::cout, cin, cerr et clog sont instantiés avant entrée dans main(), il faut donc
#appeler explicitement imbue()
C ET C++ ==> #En C, setlocale() modifie les LC_MACRO, dont LC_ALL.
#En C++, std::locale::global() modifie un autre objet : les locales en C et en C++ n'ont donc pas de
#lien.
locale #Représente une locale.
LOCALE([STR]) #Construit LOCALE avec STR :
# - "" : la locale du système courant
# - "C", "POSIX" : locale classique et standard
# - nom d'une locale, par exemple "en_US" ou "en_US.UTF-8"
#Si STR est absent :
# - si locale::global() a été appelé : la LOCAL globale
# - sinon locale::classic()
#Si STR n'existe pas, lance une exception runtime_error
#On ne peut pas construire implicitement un LOCALE avec une STR : pour une LOCALE temporaire, faire
#explicitement std::locale( "" ).
LOCALE(LOCALE2,FACT_ADR)#Copyconstruct avec LOCALE2, sauf FACET qui est rajouté/
#modifié.
locale::classic() #Renvoie LOCALE("C")
locale::global(LOCALE) #LOCALE devient la LOCALE globale.
LOCALE.name() #Renvoie le STR de LOCALE, sous forme de STRING, "*"
#si LOCALE n'a pas de nom.
LOCALE.combine<facet> #Renvoie LOCALE, avec sa FACET facet modifié, à l'image
(LOCALE2) #de celle de LOCALE2.
#Lance runtime_error si LOCALE2 n'a pas cette facet.
LOCALE == LOCALE2
LOCALE != LOCALE2 #Comparaisons
FACET ==> #Elles dérivent de std::facet, et définissent un membre
#std::locale::id (tag)
#Chaque FACET a un template T indiquant le char_type. Utiliser le char_type de l'OS courant.
#Renvoie donc des STRING et CHAR selon ce T, quel que soit charset de la locale.
#CHAR_TYPE signifie T, et STRING_TYPE BASIC_STRING<T>
locale::facet #Base classe pour facet. Non copiable.
FACET([SIZE_T_VAL]) #Protected constructor. Si SIZE_T_VAL == 0 (défaut),
#est automatiquement détruit quand le dernier LOCALE lié
#cesse d'exister.
locale::id #Tag utilisé par FACET. Non copiable.
#Instantié souvent avec des flags locale::category or'd:
# - locale::collate
# - locale::ctype
# - locale::monetary
# - locale::numeric
# - locale::time
# - locale::messages
# - locale::all
has_facet<facet>(LOCALE)#Renvoie true si FACET pour LOCALE existe.
use_facet<facet>(LOCALE)#Renvoie la FACET facet, pour la LOCALE donnée.
#Lance bad_cast si facet absente.
#Si initialise une FACET, elle doit être const&
FACETS ==> #Voici :
ctype<T> #Classification des classes [[:POSIX:]] et conversion de caractères en fonction du charset courant.
ctype::char_type #typdef depuis T.
ctype::mask #Désigne une classe POSIX (or'd), parmi :
# - ctype::space, print, cntrl, upper, lower, alpha, digit, punct, xdigit
CTYPE.is(MASK, CHAR_TYP)#Renvoie true si CHAR_TYPE correspond à MASK.
CTYPE.is(CHR_TP_ADR1, #Même chose pour pour un array de CHAR_TYPE, et écrit
CHR_TPADR2, MASK_ADR) #dans un array de MASK.
CTYPE.scan_is(MASK, #Renvoie l'adresse du premier CHAR_TYPE correspondant
CHR_TPADR1, CHR_TPADR2) #à MASK.
CTYPE.toupper(CHAR_TYPE)
CTYPE.toupper #Renvoie uppercase, selon le charset de la LOCALE courante.
(CHR_TP_ADR, CHR_TPADR2)
CTYPE.tolower(CHAR_TYPE)
CTYPE.tolower #Même chose, lowercase.
(CHR_TP_ADR, CHR_TPADR2)#CHAR_TYPE_ADR est donc une [W]STR
CTYPE.widen(CHAR_VAL) #Renvoie CHAR_VAL transtypé en CHAR_TYPE
CTYPE.widen(CHR_TYP_ADR,
CHR_TP_ADR2, STR) #Renvoie [W]STR transtypé en STR dans STR.
CTYPE.narrow(CHAR_TYPE1,#Renvoie l'équivalent de CHAR_TYPE1 dans le charset de la LOCALE courante, sous forme de CHAR_VAL,
CHAR_VAL2) #ou CHAR_VAL2 si pas d'équivalents.
CTYPE.narrow(CHR_TP_ADR,
CHR_TP_ADR2, CHAR_VAL,
STR)
codecvt<T,U,V> #Pour la conversion d'un type utilisé charset vers celui d'autre : par exemple entre un char pour UTF-8
#et un wchar_t pour UTF-16 (et non UTF-8 vers UTF-16)
#T est le type de départ, U celui d'arrivée, V le shift state type (en général mbstate_t)
CODECVT.in #Convertit la string T_ADR1-T_ADR2 en U, et la place dans la string U_ADR1-U_ADR1.
( V_VAR, 3 T_ADR, #Considère le shift state V_VAR. T_ADR3 pointe après le dernier caractère converti, de même que U_ADR3.
3 U_ADR ) #Renvoie un CODECVT::RESULT, parmi : CODECVT::ERROR, CODECVT::PARTIAL (pas assez de place),
#CODECVT::NOCONV (T == U) et CODECVT::OK.
CODECVT.out( ARGS ) #Même chose dans l'autre sens.
CODECVT.encoding() #Renvoie taille d'un U / taille d'un caractère locale courante en T, et 0 si variable, et -1 si shift-
#dependant, sous forme d'INT_VAL.
CODECVT.max_length() #Revoie taille maximum d'un caractère locale courante, en U.
numpunct<T> #Virgules décimales et mot représentant true et false
NUMPUNCT.truename() #Renvoie nom de "true", sous forme de STRING_TYPE
NUMPUNCT.falsename() #Pareil pour "false"
NUMPUNCT.decimal_point()#Renvoie virgule décimale (hors argent), sous forme de CHAR_TYPE
NUMPUNCT.thousand_sep() #Même chose pour séparateur entre groupe de milliers
NUMPUNCT.grouping() #Renvoie groupement en groupes de milliers sous forme de suite de nombres représenté par une
#STRING_TYPE. Le dernier chiffre est répété indéfiniment. Un nombre négatif ou CHAR_MAX signifie
#illimité. Si STRING_TYPE vide, pas de grouping.
num_get<T> #Lecture des nombres (caractères -> nombres), utilisé par ISTREAM >> (si locale courante imbued)
num_put<T> #Ecriture des nombres, utilisé par OSTREAM << (si locale courante imbued)
moneypunct<T> #Virgules pour les sommes d'argent
#Pour imprimer sur OSTREAM une somme d'argent, avec C++11 uniquement :
# - faire OSTREAM.imbue()
# - puis utiliser manipulator (<iomanip>), std::put_money( DOUBLE_VAL ), où DOUBLE_VAL est la somme.
# ex : std::cout << std::put_money( ... ) << "\n"
#get_money( DOUBLE_VAR ) fait l'inverse.
MONYPNCT.decimal_point()#
MONEYPNCT.thousand_sep()#
MONEYPUNCT.grouping() #Comme NUMPUNCT, mais pour les sommes d'argent.
MONEYPUNCT.curr_symbol()#Renvoie le currency symbol, sous forme de STRING_TYPE
MONYPNCT.positive_sign()#
MONYPNCT.negative_sign()#Sous forme de STRING_TYPE
MONEYPUNCT.frac_digits()#Nombre de chiffres après la virgule pour les centimes, sous forme d'INT_VAL.
MONEYPUNCT.pos_format() #Retourne format des sommes d'argent positives sous forme de MONEYPUNCT::POS_FORMAT.
#POS_FORMAT est une struct avec un membre "field", qui est une STR de 4 CHAR_VAL. Chaque CHAR_VAL peut
#valoir l'une des valeurs de l'enum MONEYPUNCT::PART parmi :
#money_base::{none,space,symbol,sign,value}. Ex : $10 -> sign,symbol,value
MONEYPUNCT.neg_format() #Même chose pour somme d'argent négative
messages #Utilisé pour ouvrir, lire et fermer les messages catalogs, comme avec gettext.
collate<T> #Comparaisons de strings
COLLATE.compare #
( 4 CHAR_TYPE ) #( STRING_TYPE1 < STRING_TYPE2 ) : renvoie -1, 0 ou 1 selon.
COLLATE.hash(2 CHARTYPE)#Renvoie un hash LONG_INT, pour faire des comparaisons == et != de strings rapides.
COLLATE.transform #Transforme et réduit STRING_TYPE, mais gardant propriété de compairaison, permettant compairaison de
( 2 CHAR_TYPE ) #strings rapides.
time_get<T> #Lecture des date
TIME_GET.date_order() #Renvoie un enum DATEORDER indiquant ordre des dates parmi : time_get::{no_order,dmy,mdy,ymd,ydm}
time_put<T> #Ecriture des date
TIME_PUT.put( OTPT_ITVR,
OSTREAM, CHAR_VAL, #Imprime sur OTPT_ITVR la date TIME_T selon la locale courante, et selon le pattern (séquences
TIME_T, 2 CHAR_TYPE_ADR)#d'échappement date) de la STRING_TYPE, avec le fill character CHAR_VAL.
ctype_base #
codecvt_base #
time_base #Base classes à faire dériver si on veut définir sa
money_base #propre FACET de ces facet.