@@ -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