Skip to content

Commit 8c62d2d

Browse files
Conform supported encodings to Encoding spec
This change conforms the set of supported encodings for the parser to the requirements in the Encoding spec. Specifically, this restricts the set of encoding names and labels to those listed in the table at https://encoding.spec.whatwg.org/#names-and-labels, and the statement: > The table below lists all encodings and their labels user agents must > support. User agents must not support any other encodings or labels.
1 parent 4368bb9 commit 8c62d2d

File tree

1 file changed

+330
-26
lines changed

1 file changed

+330
-26
lines changed

src/nu/validator/htmlparser/io/Encoding.java

+330-26
Original file line numberDiff line numberDiff line change
@@ -55,37 +55,341 @@ public class Encoding {
5555
private static Map<String, Encoding> encodingByLabel =
5656
new HashMap<String, Encoding>();
5757

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+
58388
private final String canonName;
59389

60390
private final Charset charset;
61391

62392
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-
}
89393
UTF8 = forName("utf-8");
90394
UTF16 = forName("utf-16");
91395
UTF16BE = forName("utf-16be");

0 commit comments

Comments
 (0)