@@ -55,37 +55,341 @@ public class Encoding {
55
55
private static Map <String , Encoding > encodingByLabel =
56
56
new HashMap <String , Encoding >();
57
57
58
+ private static void createEncoding (String name , String [] labels ) {
59
+ if (!Charset .isSupported (name )) {
60
+ return ;
61
+ }
62
+ Charset cs = Charset .forName (name );
63
+ Encoding enc = new Encoding (name .toLowerCase ().intern (), cs );
64
+ for (String label : labels ) {
65
+ encodingByLabel .put (label , enc );
66
+ }
67
+ }
68
+
69
+ static {
70
+ /* See https://encoding.spec.whatwg.org/#names-and-labels */
71
+ createEncoding ( //
72
+ "UTF-8" , new String [] { //
73
+ "unicode-1-1-utf-8" , //
74
+ "unicode11utf8" , //
75
+ "unicode20utf8" , //
76
+ "utf-8" , //
77
+ "utf8" , //
78
+ "x-unicode20utf8" });
79
+ createEncoding ( //
80
+ "IBM866" , new String [] { //
81
+ "866" , //
82
+ "cp866" , //
83
+ "csibm866" , //
84
+ "ibm866" });
85
+ createEncoding ( //
86
+ "ISO-8859-2" , new String [] { //
87
+ "csisolatin2" , //
88
+ "iso-8859-2" , //
89
+ "iso-ir-101" , //
90
+ "iso8859-2" , //
91
+ "iso88592" , //
92
+ "iso_8859-2" , //
93
+ "iso_8859-2:1987" , //
94
+ "l2" , //
95
+ "latin2" });
96
+ createEncoding ( //
97
+ "ISO-8859-3" , new String [] { //
98
+ "csisolatin3" , //
99
+ "iso-8859-3" , //
100
+ "iso-ir-109" , //
101
+ "iso8859-3" , //
102
+ "iso88593" , //
103
+ "iso_8859-3" , //
104
+ "iso_8859-3:1988" , //
105
+ "l3" , //
106
+ "latin3" });
107
+ createEncoding ( //
108
+ "ISO-8859-4" , new String [] { //
109
+ "csisolatin4" , //
110
+ "iso-8859-4" , //
111
+ "iso-ir-110" , //
112
+ "iso8859-4" , //
113
+ "iso88594" , //
114
+ "iso_8859-4" , //
115
+ "iso_8859-4:1988" , //
116
+ "l4" , //
117
+ "latin4" });
118
+ createEncoding ( //
119
+ "ISO-8859-5" , new String [] { //
120
+ "csisolatincyrillic" , //
121
+ "cyrillic" , //
122
+ "iso-8859-5" , //
123
+ "iso-ir-144" , //
124
+ "iso8859-5" , //
125
+ "iso88595" , //
126
+ "iso_8859-5" , //
127
+ "iso_8859-5:1988" });
128
+ createEncoding ( //
129
+ "ISO-8859-6" , new String [] { //
130
+ "arabic" , //
131
+ "asmo-708" , //
132
+ "csiso88596e" , //
133
+ "csiso88596i" , //
134
+ "csisolatinarabic" , //
135
+ "ecma-114" , //
136
+ "iso-8859-6" , //
137
+ "iso-8859-6-e" , //
138
+ "iso-8859-6-i" , //
139
+ "iso-ir-127" , //
140
+ "iso8859-6" , //
141
+ "iso88596" , //
142
+ "iso_8859-6" , //
143
+ "iso_8859-6:1987" });
144
+ createEncoding ( //
145
+ "ISO-8859-7" , new String [] { //
146
+ "csisolatingreek" , //
147
+ "ecma-118" , //
148
+ "elot_928" , //
149
+ "greek" , //
150
+ "greek8" , //
151
+ "iso-8859-7" , //
152
+ "iso-ir-126" , //
153
+ "iso8859-7" , //
154
+ "iso88597" , //
155
+ "iso_8859-7" , //
156
+ "iso_8859-7:1987" , //
157
+ "sun_eu_greek" });
158
+ createEncoding ( //
159
+ "ISO-8859-8" , new String [] { //
160
+ "csiso88598e" , //
161
+ "csisolatinhebrew" , //
162
+ "hebrew" , //
163
+ "iso-8859-8" , //
164
+ "iso-8859-8-e" , //
165
+ "iso-ir-138" , //
166
+ "iso8859-8" , //
167
+ "iso88598" , //
168
+ "iso_8859-8" , //
169
+ "iso_8859-8:1988" , //
170
+ "visual" });
171
+ createEncoding ( //
172
+ // Unsupported in Java
173
+ "ISO-8859-8-I" , new String [] { //
174
+ "csiso88598i" , //
175
+ "iso-8859-8-i" , //
176
+ "logical" });
177
+ createEncoding ( //
178
+ // Unsupported in Java
179
+ "ISO-8859-10" , new String [] { //
180
+ "csisolatin6" , //
181
+ "iso-8859-10" , //
182
+ "iso-ir-157" , //
183
+ "iso8859-10" , //
184
+ "iso885910" , //
185
+ "l6" , //
186
+ "latin6" });
187
+ createEncoding ( //
188
+ "ISO-8859-13" , new String [] { //
189
+ "iso-8859-13" , //
190
+ "iso8859-13" , //
191
+ "iso885913" });
192
+ createEncoding ( //
193
+ // Unsupported in Java
194
+ "ISO-8859-14" , new String [] { //
195
+ "iso-8859-14" , //
196
+ "iso8859-14" , //
197
+ "iso885914" });
198
+ createEncoding ( //
199
+ "ISO-8859-15" , new String [] { //
200
+ "csisolatin9" , //
201
+ "iso-8859-15" , //
202
+ "iso8859-15" , //
203
+ "iso885915" , //
204
+ "iso_8859-15" , //
205
+ "l9" });
206
+ createEncoding ( //
207
+ "ISO-8859-16" , new String [] { //
208
+ "iso-8859-16" });
209
+ createEncoding ( //
210
+ "KOI8-R" , new String [] { //
211
+ "cskoi8r" , //
212
+ "koi" , //
213
+ "koi8" , //
214
+ "koi8-r" , //
215
+ "koi8_r" });
216
+ createEncoding ( //
217
+ "KOI8-U" , new String [] { //
218
+ "koi8-ru" , //
219
+ "koi8-u" });
220
+ createEncoding ( //
221
+ // Unsupported in Java
222
+ "macintosh" , new String [] { //
223
+ "csmacintosh" , //
224
+ "mac" , //
225
+ "macintosh" , //
226
+ "x-mac-roman" });
227
+ createEncoding ( //
228
+ "windows-874" , new String [] { //
229
+ "dos-874" , //
230
+ "iso-8859-11" , //
231
+ "iso8859-11" , //
232
+ "iso885911" , //
233
+ "tis-620" , //
234
+ "windows-874" });
235
+ createEncoding ( //
236
+ "windows-1250" , new String [] { //
237
+ "cp1250" , //
238
+ "windows-1250" , //
239
+ "x-cp1250" });
240
+ createEncoding ( //
241
+ "windows-1251" , new String [] { //
242
+ "cp1251" , //
243
+ "windows-1251" , //
244
+ "x-cp1251" });
245
+ createEncoding ( //
246
+ "windows-1252" , new String [] { //
247
+ "ansi_x3.4-1968" , //
248
+ "ascii" , //
249
+ "cp1252" , //
250
+ "cp819" , //
251
+ "csisolatin1" , //
252
+ "ibm819" , //
253
+ "iso-8859-1" , //
254
+ "iso-ir-100" , //
255
+ "iso8859-1" , //
256
+ "iso88591" , //
257
+ "iso_8859-1" , //
258
+ "iso_8859-1:1987" , //
259
+ "l1" , //
260
+ "latin1" , //
261
+ "us-ascii" , //
262
+ "windows-1252" , //
263
+ "x-cp1252" });
264
+ createEncoding ( //
265
+ "windows-1253" , new String [] { //
266
+ "cp1253" , //
267
+ "windows-1253" , //
268
+ "x-cp1253" });
269
+ createEncoding ( //
270
+ "windows-1254" , new String [] { //
271
+ "cp1254" , //
272
+ "csisolatin5" , //
273
+ "iso-8859-9" , //
274
+ "iso-ir-148" , //
275
+ "iso8859-9" , //
276
+ "iso88599" , //
277
+ "iso_8859-9" , //
278
+ "iso_8859-9:1989" , //
279
+ "l5" , //
280
+ "latin5" , //
281
+ "windows-1254" , //
282
+ "x-cp1254" });
283
+ createEncoding ( //
284
+ "windows-1255" , new String [] { //
285
+ "cp1255" , //
286
+ "windows-1255" , //
287
+ "x-cp1255" });
288
+ createEncoding ( //
289
+ "windows-1256" , new String [] { //
290
+ "cp1256" , //
291
+ "windows-1256" , //
292
+ "x-cp1256" });
293
+ createEncoding ( //
294
+ "windows-1257" , new String [] { //
295
+ "cp1257" , //
296
+ "windows-1257" , //
297
+ "x-cp1257" });
298
+ createEncoding ( //
299
+ "windows-1258" , new String [] { //
300
+ "cp1258" , //
301
+ "windows-1258" , //
302
+ "x-cp1258" });
303
+ createEncoding ( //
304
+ // Unsupported in Java
305
+ "x-mac-cyrillic" , new String [] { //
306
+ "x-mac-cyrillic" , //
307
+ "x-mac-ukrainian" });
308
+ createEncoding ( //
309
+ "GBK" , new String [] { //
310
+ "chinese" , //
311
+ "csgb2312" , //
312
+ "csiso58gb231280" , //
313
+ "gb2312" , //
314
+ "gb_2312" , //
315
+ "gb_2312-80" , //
316
+ "gbk" , //
317
+ "iso-ir-58" , //
318
+ "x-gbk" });
319
+ createEncoding ( //
320
+ "gb18030" , new String [] { //
321
+ "gb18030" });
322
+ createEncoding ( //
323
+ "Big5" , new String [] { //
324
+ "big5" , //
325
+ "big5-hkscs" , //
326
+ "cn-big5" , //
327
+ "csbig5" , //
328
+ "x-x-big5" });
329
+ createEncoding ( //
330
+ "EUC-JP" , new String [] { //
331
+ "cseucpkdfmtjapanese" , //
332
+ "euc-jp" , //
333
+ "x-euc-jp" });
334
+ createEncoding ( //
335
+ "ISO-2022-JP" , new String [] { //
336
+ "csiso2022jp" , //
337
+ "iso-2022-jp" });
338
+ createEncoding ( //
339
+ "Shift_JIS" , new String [] { //
340
+ "csshiftjis" , //
341
+ "ms932" , //
342
+ "ms_kanji" , //
343
+ "shift-jis" , //
344
+ "shift_jis" , //
345
+ "sjis" , //
346
+ "windows-31j" , //
347
+ "x-sjis" });
348
+ createEncoding ( //
349
+ "EUC-KR" , new String [] { //
350
+ "cseuckr" , //
351
+ "csksc56011987" , //
352
+ "euc-kr" , //
353
+ "iso-ir-149" , //
354
+ "korean" , //
355
+ "ks_c_5601-1987" , //
356
+ "ks_c_5601-1989" , //
357
+ "ksc5601" , //
358
+ "ksc_5601" , //
359
+ "windows-949" });
360
+ createEncoding ( //
361
+ // Special case
362
+ "replacement" , new String [] { //
363
+ "csiso2022kr" , //
364
+ "hz-gb-2312" , //
365
+ "iso-2022-cn" , //
366
+ "iso-2022-cn-ext" , //
367
+ "iso-2022-kr" , //
368
+ "replacement" });
369
+ createEncoding ( //
370
+ "UTF-16BE" , new String [] { //
371
+ "unicodefffe" , //
372
+ "utf-16be" });
373
+ createEncoding ( //
374
+ "UTF-16LE" , new String [] { //
375
+ "csunicode" , //
376
+ "iso-10646-ucs-2" , //
377
+ "ucs-2" , //
378
+ "unicode" , //
379
+ "unicodefeff" , //
380
+ "utf-16" , //
381
+ "utf-16le" });
382
+ createEncoding ( //
383
+ // Special case
384
+ "x-user-defined" , new String [] { //
385
+ "x-user-defined" });
386
+ }
387
+
58
388
private final String canonName ;
59
389
60
390
private final Charset charset ;
61
391
62
392
static {
63
- Set <Encoding > encodings = new HashSet <Encoding >();
64
-
65
- SortedMap <String , Charset > charsets = Charset .availableCharsets ();
66
- for (Map .Entry <String , Charset > entry : charsets .entrySet ()) {
67
- Charset cs = entry .getValue ();
68
- String name = toNameKey (cs .name ());
69
- String canonName = toAsciiLowerCase (cs .name ());
70
- if (!isBanned (name )) {
71
- name = name .intern ();
72
- boolean asciiSuperset = asciiMapsToBasicLatin (testBuf , cs );
73
- Encoding enc = new Encoding (canonName .intern (), cs ,
74
- asciiSuperset , isObscure (name ), isShouldNot (name ),
75
- isLikelyEbcdic (name , asciiSuperset ));
76
- encodings .add (enc );
77
- Set <String > aliases = cs .aliases ();
78
- for (String alias : aliases ) {
79
- encodingByLabel .put (toNameKey (alias ).intern (), enc );
80
- }
81
- }
82
- }
83
- // Overwrite possible overlapping aliases with the real things--just in
84
- // case
85
- for (Encoding encoding : encodings ) {
86
- encodingByLabel .put (toNameKey (encoding .getCanonName ()),
87
- encoding );
88
- }
89
393
UTF8 = forName ("utf-8" );
90
394
UTF16 = forName ("utf-16" );
91
395
UTF16BE = forName ("utf-16be" );
0 commit comments