@@ -64,15 +64,238 @@ public class Encoding {
64
64
"xutf32lebom" , "xutf16oppositeendian" , "xutf16platformendian" ,
65
65
"xutf32oppositeendian" , "xutf32platformendian" };
66
66
67
- private static String [] NOT_OBSCURE = { "big5" , "big5hkscs" , "eucjp" ,
68
- "euckr" , "gb18030" , "gbk" , "iso2022jp" , "iso2022kr" , "iso88591" ,
69
- "iso885913" , "iso885915" , "iso88592" , "iso88593" , "iso88594" ,
70
- "iso88595" , "iso88596" , "iso88597" , "iso88598" , "iso88599" ,
71
- "koi8r" , "shiftjis" , "tis620" , "usascii" , "utf16" , "utf16be" ,
72
- "utf16le" , "utf8" , "windows1250" , "windows1251" , "windows1252" ,
73
- "windows1253" , "windows1254" , "windows1255" , "windows1256" ,
74
- "windows1257" , "windows1258" };
75
-
67
+ /* From the table at https://encoding.spec.whatwg.org/#names-and-labels,
68
+ * everything in the Labels column, sorted */
69
+ private static String [] NOT_OBSCURE = { //
70
+ "866" , //
71
+ "ansi_x3.4-1968" , //
72
+ "arabic" , //
73
+ "ascii" , //
74
+ "asmo-708" , //
75
+ "big5" , //
76
+ "big5-hkscs" , //
77
+ "chinese" , //
78
+ "cn-big5" , //
79
+ "cp1250" , //
80
+ "cp1251" , //
81
+ "cp1252" , //
82
+ "cp1253" , //
83
+ "cp1254" , //
84
+ "cp1255" , //
85
+ "cp1256" , //
86
+ "cp1257" , //
87
+ "cp1258" , //
88
+ "cp819" , //
89
+ "cp866" , //
90
+ "csbig5" , //
91
+ "cseuckr" , //
92
+ "cseucpkdfmtjapanese" , //
93
+ "csgb2312" , //
94
+ "csibm866" , //
95
+ "csiso2022jp" , //
96
+ "csiso2022kr" , //
97
+ "csiso58gb231280" , //
98
+ "csiso88596e" , //
99
+ "csiso88596i" , //
100
+ "csiso88598e" , //
101
+ "csiso88598i" , //
102
+ "csisolatin1" , //
103
+ "csisolatin2" , //
104
+ "csisolatin3" , //
105
+ "csisolatin4" , //
106
+ "csisolatin5" , //
107
+ "csisolatin6" , //
108
+ "csisolatin9" , //
109
+ "csisolatinarabic" , //
110
+ "csisolatincyrillic" , //
111
+ "csisolatingreek" , //
112
+ "csisolatinhebrew" , //
113
+ "cskoi8r" , //
114
+ "csksc56011987" , //
115
+ "csmacintosh" , //
116
+ "csshiftjis" , //
117
+ "csunicode" , //
118
+ "cyrillic" , //
119
+ "dos-874" , //
120
+ "ecma-114" , //
121
+ "ecma-118" , //
122
+ "elot_928" , //
123
+ "euc-jp" , //
124
+ "euc-kr" , //
125
+ "gb18030" , //
126
+ "gb2312" , //
127
+ "gb_2312" , //
128
+ "gb_2312-80" , //
129
+ "gbk" , //
130
+ "greek" , //
131
+ "greek8" , //
132
+ "hebrew" , //
133
+ "hz-gb-2312" , //
134
+ "ibm819" , //
135
+ "ibm866" , //
136
+ "iso-10646-ucs-2" , //
137
+ "iso-2022-cn" , //
138
+ "iso-2022-cn-ext" , //
139
+ "iso-2022-jp" , //
140
+ "iso-2022-kr" , //
141
+ "iso-8859-1" , //
142
+ "iso-8859-10" , //
143
+ "iso-8859-11" , //
144
+ "iso-8859-13" , //
145
+ "iso-8859-14" , //
146
+ "iso-8859-15" , //
147
+ "iso-8859-16" , //
148
+ "iso-8859-2" , //
149
+ "iso-8859-3" , //
150
+ "iso-8859-4" , //
151
+ "iso-8859-5" , //
152
+ "iso-8859-6" , //
153
+ "iso-8859-6-e" , //
154
+ "iso-8859-6-i" , //
155
+ "iso-8859-7" , //
156
+ "iso-8859-8" , //
157
+ "iso-8859-8-e" , //
158
+ "iso-8859-8-i" , //
159
+ "iso-8859-9" , //
160
+ "iso-ir-100" , //
161
+ "iso-ir-101" , //
162
+ "iso-ir-109" , //
163
+ "iso-ir-110" , //
164
+ "iso-ir-126" , //
165
+ "iso-ir-127" , //
166
+ "iso-ir-138" , //
167
+ "iso-ir-144" , //
168
+ "iso-ir-148" , //
169
+ "iso-ir-149" , //
170
+ "iso-ir-157" , //
171
+ "iso-ir-58" , //
172
+ "iso8859-1" , //
173
+ "iso8859-10" , //
174
+ "iso8859-11" , //
175
+ "iso8859-13" , //
176
+ "iso8859-14" , //
177
+ "iso8859-15" , //
178
+ "iso8859-2" , //
179
+ "iso8859-3" , //
180
+ "iso8859-4" , //
181
+ "iso8859-5" , //
182
+ "iso8859-6" , //
183
+ "iso8859-7" , //
184
+ "iso8859-8" , //
185
+ "iso8859-9" , //
186
+ "iso88591" , //
187
+ "iso885910" , //
188
+ "iso885911" , //
189
+ "iso885913" , //
190
+ "iso885914" , //
191
+ "iso885915" , //
192
+ "iso88592" , //
193
+ "iso88593" , //
194
+ "iso88594" , //
195
+ "iso88595" , //
196
+ "iso88596" , //
197
+ "iso88597" , //
198
+ "iso88598" , //
199
+ "iso88599" , //
200
+ "iso_8859-1" , //
201
+ "iso_8859-15" , //
202
+ "iso_8859-1:1987" , //
203
+ "iso_8859-2" , //
204
+ "iso_8859-2:1987" , //
205
+ "iso_8859-3" , //
206
+ "iso_8859-3:1988" , //
207
+ "iso_8859-4" , //
208
+ "iso_8859-4:1988" , //
209
+ "iso_8859-5" , //
210
+ "iso_8859-5:1988" , //
211
+ "iso_8859-6" , //
212
+ "iso_8859-6:1987" , //
213
+ "iso_8859-7" , //
214
+ "iso_8859-7:1987" , //
215
+ "iso_8859-8" , //
216
+ "iso_8859-8:1988" , //
217
+ "iso_8859-9" , //
218
+ "iso_8859-9:1989" , //
219
+ "koi" , //
220
+ "koi8" , //
221
+ "koi8-r" , //
222
+ "koi8-ru" , //
223
+ "koi8-u" , //
224
+ "koi8_r" , //
225
+ "korean" , //
226
+ "ks_c_5601-1987" , //
227
+ "ks_c_5601-1989" , //
228
+ "ksc5601" , //
229
+ "ksc_5601" , //
230
+ "l1" , //
231
+ "l2" , //
232
+ "l3" , //
233
+ "l4" , //
234
+ "l5" , //
235
+ "l6" , //
236
+ "l9" , //
237
+ "latin1" , //
238
+ "latin2" , //
239
+ "latin3" , //
240
+ "latin4" , //
241
+ "latin5" , //
242
+ "latin6" , //
243
+ "logical" , //
244
+ "mac" , //
245
+ "macintosh" , //
246
+ "ms932" , //
247
+ "ms_kanji" , //
248
+ "replacement" , //
249
+ "shift-jis" , //
250
+ "shift_jis" , //
251
+ "sjis" , //
252
+ "sun_eu_greek" , //
253
+ "tis-620" , //
254
+ "ucs-2" , //
255
+ "unicode" , //
256
+ "unicode-1-1-utf-8" , //
257
+ "unicode11utf8" , //
258
+ "unicode20utf8" , //
259
+ "unicodefeff" , //
260
+ "unicodefffe" , //
261
+ "us-ascii" , //
262
+ "utf-16" , //
263
+ "utf-16be" , //
264
+ "utf-16le" , //
265
+ "utf-8" , //
266
+ "utf8" , //
267
+ "visual" , //
268
+ "windows-1250" , //
269
+ "windows-1251" , //
270
+ "windows-1252" , //
271
+ "windows-1253" , //
272
+ "windows-1254" , //
273
+ "windows-1255" , //
274
+ "windows-1256" , //
275
+ "windows-1257" , //
276
+ "windows-1258" , //
277
+ "windows-31j" , //
278
+ "windows-874" , //
279
+ "windows-949" , //
280
+ "x-cp1250" , //
281
+ "x-cp1251" , //
282
+ "x-cp1252" , //
283
+ "x-cp1253" , //
284
+ "x-cp1254" , //
285
+ "x-cp1255" , //
286
+ "x-cp1256" , //
287
+ "x-cp1257" , //
288
+ "x-cp1258" , //
289
+ "x-euc-jp" , //
290
+ "x-gbk" , //
291
+ "x-mac-cyrillic" , //
292
+ "x-mac-roman" , //
293
+ "x-mac-ukrainian" , //
294
+ "x-sjis" , //
295
+ "x-unicode20utf8" , //
296
+ "x-user-defined" , //
297
+ "x-x-big5" , //
298
+ };
76
299
private static Map <String , Encoding > encodingByCookedName = new HashMap <String , Encoding >();
77
300
78
301
private final String canonName ;
@@ -106,11 +329,12 @@ public class Encoding {
106
329
Charset cs = entry .getValue ();
107
330
String name = toNameKey (cs .name ());
108
331
String canonName = toAsciiLowerCase (cs .name ());
109
- if (!isBanned (name )) {
332
+ if (!isBanned (stripDashAndUnderscore ( name ) )) {
110
333
name = name .intern ();
111
334
boolean asciiSuperset = asciiMapsToBasicLatin (testBuf , cs );
112
335
Encoding enc = new Encoding (canonName .intern (), cs ,
113
- asciiSuperset , isObscure (name ), isShouldNot (name ),
336
+ asciiSuperset , isObscure (name ),
337
+ isShouldNot (stripDashAndUnderscore (name )),
114
338
isLikelyEbcdic (name , asciiSuperset ));
115
339
encodings .add (enc );
116
340
Set <String > aliases = cs .aliases ();
@@ -254,16 +478,28 @@ public static String toNameKey(String str) {
254
478
if (c >= 'A' && c <= 'Z' ) {
255
479
c += 0x20 ;
256
480
}
257
- if (!((c >= '\t' && c <= '\r' ) || (c >= '\u0020' && c <= '\u002F' )
258
- || (c >= '\u003A' && c <= '\u0040' )
259
- || (c >= '\u005B' && c <= '\u0060' ) || (c >= '\u007B' && c <= '\u007E' ))) {
481
+ if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r' )) {
260
482
buf [j ] = c ;
261
483
j ++;
262
484
}
263
485
}
264
486
return new String (buf , 0 , j );
265
487
}
266
488
489
+ public static String stripDashAndUnderscore (String str ) {
490
+ if (str == null ) {
491
+ return null ;
492
+ }
493
+ char [] buf = new char [str .length ()];
494
+ for (int i = 0 ; i < str .length (); i ++) {
495
+ char c = str .charAt (i );
496
+ if (c == '-' || c == '_' ) {
497
+ buf [i ] = c ;
498
+ }
499
+ }
500
+ return new String (buf );
501
+ }
502
+
267
503
public static String toAsciiLowerCase (String str ) {
268
504
if (str == null ) {
269
505
return null ;
0 commit comments