diff --git a/src/nu/validator/htmlparser/io/Encoding.java b/src/nu/validator/htmlparser/io/Encoding.java index 3bbc606f..123465f8 100644 --- a/src/nu/validator/htmlparser/io/Encoding.java +++ b/src/nu/validator/htmlparser/io/Encoding.java @@ -64,15 +64,238 @@ public class Encoding { "xutf32lebom", "xutf16oppositeendian", "xutf16platformendian", "xutf32oppositeendian", "xutf32platformendian" }; - private static String[] NOT_OBSCURE = { "big5", "big5hkscs", "eucjp", - "euckr", "gb18030", "gbk", "iso2022jp", "iso2022kr", "iso88591", - "iso885913", "iso885915", "iso88592", "iso88593", "iso88594", - "iso88595", "iso88596", "iso88597", "iso88598", "iso88599", - "koi8r", "shiftjis", "tis620", "usascii", "utf16", "utf16be", - "utf16le", "utf8", "windows1250", "windows1251", "windows1252", - "windows1253", "windows1254", "windows1255", "windows1256", - "windows1257", "windows1258" }; - + /* From the table at https://encoding.spec.whatwg.org/#names-and-labels, + * everything in the Labels column, sorted */ + private static String[] NOT_OBSCURE = { // + "866", // + "ansi_x3.4-1968", // + "arabic", // + "ascii", // + "asmo-708", // + "big5", // + "big5-hkscs", // + "chinese", // + "cn-big5", // + "cp1250", // + "cp1251", // + "cp1252", // + "cp1253", // + "cp1254", // + "cp1255", // + "cp1256", // + "cp1257", // + "cp1258", // + "cp819", // + "cp866", // + "csbig5", // + "cseuckr", // + "cseucpkdfmtjapanese", // + "csgb2312", // + "csibm866", // + "csiso2022jp", // + "csiso2022kr", // + "csiso58gb231280", // + "csiso88596e", // + "csiso88596i", // + "csiso88598e", // + "csiso88598i", // + "csisolatin1", // + "csisolatin2", // + "csisolatin3", // + "csisolatin4", // + "csisolatin5", // + "csisolatin6", // + "csisolatin9", // + "csisolatinarabic", // + "csisolatincyrillic", // + "csisolatingreek", // + "csisolatinhebrew", // + "cskoi8r", // + "csksc56011987", // + "csmacintosh", // + "csshiftjis", // + "csunicode", // + "cyrillic", // + "dos-874", // + "ecma-114", // + "ecma-118", // + "elot_928", // + "euc-jp", // + "euc-kr", // + "gb18030", // + "gb2312", // + "gb_2312", // + "gb_2312-80", // + "gbk", // + "greek", // + "greek8", // + "hebrew", // + "hz-gb-2312", // + "ibm819", // + "ibm866", // + "iso-10646-ucs-2", // + "iso-2022-cn", // + "iso-2022-cn-ext", // + "iso-2022-jp", // + "iso-2022-kr", // + "iso-8859-1", // + "iso-8859-10", // + "iso-8859-11", // + "iso-8859-13", // + "iso-8859-14", // + "iso-8859-15", // + "iso-8859-16", // + "iso-8859-2", // + "iso-8859-3", // + "iso-8859-4", // + "iso-8859-5", // + "iso-8859-6", // + "iso-8859-6-e", // + "iso-8859-6-i", // + "iso-8859-7", // + "iso-8859-8", // + "iso-8859-8-e", // + "iso-8859-8-i", // + "iso-8859-9", // + "iso-ir-100", // + "iso-ir-101", // + "iso-ir-109", // + "iso-ir-110", // + "iso-ir-126", // + "iso-ir-127", // + "iso-ir-138", // + "iso-ir-144", // + "iso-ir-148", // + "iso-ir-149", // + "iso-ir-157", // + "iso-ir-58", // + "iso8859-1", // + "iso8859-10", // + "iso8859-11", // + "iso8859-13", // + "iso8859-14", // + "iso8859-15", // + "iso8859-2", // + "iso8859-3", // + "iso8859-4", // + "iso8859-5", // + "iso8859-6", // + "iso8859-7", // + "iso8859-8", // + "iso8859-9", // + "iso88591", // + "iso885910", // + "iso885911", // + "iso885913", // + "iso885914", // + "iso885915", // + "iso88592", // + "iso88593", // + "iso88594", // + "iso88595", // + "iso88596", // + "iso88597", // + "iso88598", // + "iso88599", // + "iso_8859-1", // + "iso_8859-15", // + "iso_8859-1:1987", // + "iso_8859-2", // + "iso_8859-2:1987", // + "iso_8859-3", // + "iso_8859-3:1988", // + "iso_8859-4", // + "iso_8859-4:1988", // + "iso_8859-5", // + "iso_8859-5:1988", // + "iso_8859-6", // + "iso_8859-6:1987", // + "iso_8859-7", // + "iso_8859-7:1987", // + "iso_8859-8", // + "iso_8859-8:1988", // + "iso_8859-9", // + "iso_8859-9:1989", // + "koi", // + "koi8", // + "koi8-r", // + "koi8-ru", // + "koi8-u", // + "koi8_r", // + "korean", // + "ks_c_5601-1987", // + "ks_c_5601-1989", // + "ksc5601", // + "ksc_5601", // + "l1", // + "l2", // + "l3", // + "l4", // + "l5", // + "l6", // + "l9", // + "latin1", // + "latin2", // + "latin3", // + "latin4", // + "latin5", // + "latin6", // + "logical", // + "mac", // + "macintosh", // + "ms932", // + "ms_kanji", // + "replacement", // + "shift-jis", // + "shift_jis", // + "sjis", // + "sun_eu_greek", // + "tis-620", // + "ucs-2", // + "unicode", // + "unicode-1-1-utf-8", // + "unicode11utf8", // + "unicode20utf8", // + "unicodefeff", // + "unicodefffe", // + "us-ascii", // + "utf-16", // + "utf-16be", // + "utf-16le", // + "utf-8", // + "utf8", // + "visual", // + "windows-1250", // + "windows-1251", // + "windows-1252", // + "windows-1253", // + "windows-1254", // + "windows-1255", // + "windows-1256", // + "windows-1257", // + "windows-1258", // + "windows-31j", // + "windows-874", // + "windows-949", // + "x-cp1250", // + "x-cp1251", // + "x-cp1252", // + "x-cp1253", // + "x-cp1254", // + "x-cp1255", // + "x-cp1256", // + "x-cp1257", // + "x-cp1258", // + "x-euc-jp", // + "x-gbk", // + "x-mac-cyrillic", // + "x-mac-roman", // + "x-mac-ukrainian", // + "x-sjis", // + "x-unicode20utf8", // + "x-user-defined", // + "x-x-big5", // + }; private static Map encodingByCookedName = new HashMap(); private final String canonName; @@ -106,11 +329,12 @@ public class Encoding { Charset cs = entry.getValue(); String name = toNameKey(cs.name()); String canonName = toAsciiLowerCase(cs.name()); - if (!isBanned(name)) { + if (!isBanned(stripDashAndUnderscore(name))) { name = name.intern(); boolean asciiSuperset = asciiMapsToBasicLatin(testBuf, cs); Encoding enc = new Encoding(canonName.intern(), cs, - asciiSuperset, isObscure(name), isShouldNot(name), + asciiSuperset, isObscure(name), + isShouldNot(stripDashAndUnderscore(name)), isLikelyEbcdic(name, asciiSuperset)); encodings.add(enc); Set aliases = cs.aliases(); @@ -254,9 +478,7 @@ public static String toNameKey(String str) { if (c >= 'A' && c <= 'Z') { c += 0x20; } - if (!((c >= '\t' && c <= '\r') || (c >= '\u0020' && c <= '\u002F') - || (c >= '\u003A' && c <= '\u0040') - || (c >= '\u005B' && c <= '\u0060') || (c >= '\u007B' && c <= '\u007E'))) { + if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r')) { buf[j] = c; j++; } @@ -264,6 +486,20 @@ public static String toNameKey(String str) { return new String(buf, 0, j); } + public static String stripDashAndUnderscore(String str) { + if (str == null) { + return null; + } + char[] buf = new char[str.length()]; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (c == '-' || c == '_') { + buf[i] = c; + } + } + return new String(buf); + } + public static String toAsciiLowerCase(String str) { if (str == null) { return null;