diff --git a/lib/src/codepages/unicode_iso8859.g.dart b/lib/src/codepages/unicode_iso8859.g.dart index fc37e43..2588328 100644 --- a/lib/src/codepages/unicode_iso8859.g.dart +++ b/lib/src/codepages/unicode_iso8859.g.dart @@ -16,268 +16,509 @@ // from the basic multilingual plane (code point below U+10000). // -- BEGIN GENERATED CONTENT -- -// Generated (2023-11-07T14:27) by tools/update_unicode_iso8859_tables.dart +// Generated (2023-11-09T18:40) by tools/update_unicode_iso8859_tables.dart // Characters of ISO-8859-2. +// Mapping table version: 2.0 const iso8859_2 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-2.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0104\u02D8\u0141\xA4\u013D\u015A\xA7' - '\xA8\u0160\u015E\u0164\u0179\xAD\u017D\u017B' - '\xB0\u0105\u02DB\u0142\xB4\u013E\u015B\u02C7' - '\xB8\u0161\u015F\u0165\u017A\u02DD\u017E\u017C' - '\u0154\xC1\xC2\u0102\xC4\u0139\u0106\xC7' - '\u010C\xC9\u0118\xCB\u011A\xCD\xCE\u010E' - '\u0110\u0143\u0147\xD3\xD4\u0150\xD6\xD7' - '\u0158\u016E\xDA\u0170\xDC\xDD\u0162\xDF' - '\u0155\xE1\xE2\u0103\xE4\u013A\u0107\xE7' - '\u010D\xE9\u0119\xEB\u011B\xED\xEE\u010F' - '\u0111\u0144\u0148\xF3\xF4\u0151\xF6\xF7' - '\u0159\u016F\xFA\u0171\xFC\xFD\u0163\u02D9'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0104\u02D8\u0141\u00A4\u013D\u015A\u00A7' + /* 0xA8..0xAF */ '\u00A8\u0160\u015E\u0164\u0179\u00AD\u017D\u017B' + /* 0xB0..0xB7 */ '\u00B0\u0105\u02DB\u0142\u00B4\u013E\u015B\u02C7' + /* 0xB8..0xBF */ '\u00B8\u0161\u015F\u0165\u017A\u02DD\u017E\u017C' + /* 0xC0..0xC7 */ '\u0154\u00C1\u00C2\u0102\u00C4\u0139\u0106\u00C7' + /* 0xC8..0xCF */ '\u010C\u00C9\u0118\u00CB\u011A\u00CD\u00CE\u010E' + /* 0xD0..0xD7 */ '\u0110\u0143\u0147\u00D3\u00D4\u0150\u00D6\u00D7' + /* 0xD8..0xDF */ '\u0158\u016E\u00DA\u0170\u00DC\u00DD\u0162\u00DF' + /* 0xE0..0xE7 */ '\u0155\u00E1\u00E2\u0103\u00E4\u013A\u0107\u00E7' + /* 0xE8..0xEF */ '\u010D\u00E9\u0119\u00EB\u011B\u00ED\u00EE\u010F' + /* 0xF0..0xF7 */ '\u0111\u0144\u0148\u00F3\u00F4\u0151\u00F6\u00F7' + /* 0xF8..0xFF */ '\u0159\u016F\u00FA\u0171\u00FC\u00FD\u0163\u02D9'; // Characters of ISO-8859-3. +// Mapping table version: 2.0 const iso8859_3 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-3.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0126\u02D8\xA3\xA4\uFFFD\u0124\xA7' - '\xA8\u0130\u015E\u011E\u0134\xAD\uFFFD\u017B' - '\xB0\u0127\xB2\xB3\xB4\xB5\u0125\xB7' - '\xB8\u0131\u015F\u011F\u0135\xBD\uFFFD\u017C' - '\xC0\xC1\xC2\uFFFD\xC4\u010A\u0108\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF' - '\uFFFD\xD1\xD2\xD3\xD4\u0120\xD6\xD7\u011C\xD9\xDA\xDB\xDC\u016C\u015C\xDF' - '\xE0\xE1\xE2\uFFFD\xE4\u010B\u0109\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF' - '\uFFFD\xF1\xF2\xF3\xF4\u0121\xF6\xF7' - '\u011D\xF9\xFA\xFB\xFC\u016D\u015D\u02D9'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0126\u02D8\u00A3\u00A4\uFFFD\u0124\u00A7' + /* 0xA8..0xAF */ '\u00A8\u0130\u015E\u011E\u0134\u00AD\uFFFD\u017B' + /* 0xB0..0xB7 */ '\u00B0\u0127\u00B2\u00B3\u00B4\u00B5\u0125\u00B7' + /* 0xB8..0xBF */ '\u00B8\u0131\u015F\u011F\u0135\u00BD\uFFFD\u017C' + /* 0xC0..0xC7 */ '\u00C0\u00C1\u00C2\uFFFD\u00C4\u010A\u0108\u00C7' + /* 0xC8..0xCF */ '\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF' + /* 0xD0..0xD7 */ '\uFFFD\u00D1\u00D2\u00D3\u00D4\u0120\u00D6\u00D7' + /* 0xD8..0xDF */ '\u011C\u00D9\u00DA\u00DB\u00DC\u016C\u015C\u00DF' + /* 0xE0..0xE7 */ '\u00E0\u00E1\u00E2\uFFFD\u00E4\u010B\u0109\u00E7' + /* 0xE8..0xEF */ '\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF' + /* 0xF0..0xF7 */ '\uFFFD\u00F1\u00F2\u00F3\u00F4\u0121\u00F6\u00F7' + /* 0xF8..0xFF */ '\u011D\u00F9\u00FA\u00FB\u00FC\u016D\u015D\u02D9'; // Characters of ISO-8859-4. +// Mapping table version: 2.0 const iso8859_4 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-4.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0104\u0138\u0156\xA4\u0128\u013B\xA7' - '\xA8\u0160\u0112\u0122\u0166\xAD\u017D\xAF' - '\xB0\u0105\u02DB\u0157\xB4\u0129\u013C\u02C7' - '\xB8\u0161\u0113\u0123\u0167\u014A\u017E\u014B' - '\u0100\xC1\xC2\xC3\xC4\xC5\xC6\u012E' - '\u010C\xC9\u0118\xCB\u0116\xCD\xCE\u012A' - '\u0110\u0145\u014C\u0136\xD4\xD5\xD6\xD7' - '\xD8\u0172\xDA\xDB\xDC\u0168\u016A\xDF\u0101\xE1\xE2\xE3\xE4\xE5\xE6\u012F' - '\u010D\xE9\u0119\xEB\u0117\xED\xEE\u012B' - '\u0111\u0146\u014D\u0137\xF4\xF5\xF6\xF7' - '\xF8\u0173\xFA\xFB\xFC\u0169\u016B\u02D9'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0104\u0138\u0156\u00A4\u0128\u013B\u00A7' + /* 0xA8..0xAF */ '\u00A8\u0160\u0112\u0122\u0166\u00AD\u017D\u00AF' + /* 0xB0..0xB7 */ '\u00B0\u0105\u02DB\u0157\u00B4\u0129\u013C\u02C7' + /* 0xB8..0xBF */ '\u00B8\u0161\u0113\u0123\u0167\u014A\u017E\u014B' + /* 0xC0..0xC7 */ '\u0100\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u012E' + /* 0xC8..0xCF */ '\u010C\u00C9\u0118\u00CB\u0116\u00CD\u00CE\u012A' + /* 0xD0..0xD7 */ '\u0110\u0145\u014C\u0136\u00D4\u00D5\u00D6\u00D7' + /* 0xD8..0xDF */ '\u00D8\u0172\u00DA\u00DB\u00DC\u0168\u016A\u00DF' + /* 0xE0..0xE7 */ '\u0101\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u012F' + /* 0xE8..0xEF */ '\u010D\u00E9\u0119\u00EB\u0117\u00ED\u00EE\u012B' + /* 0xF0..0xF7 */ '\u0111\u0146\u014D\u0137\u00F4\u00F5\u00F6\u00F7' + /* 0xF8..0xFF */ '\u00F8\u0173\u00FA\u00FB\u00FC\u0169\u016B\u02D9'; // Characters of ISO-8859-5. +// Mapping table version: 2.0 const iso8859_5 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-5.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0401\u0402\u0403\u0404\u0405\u0406\u0407' - '\u0408\u0409\u040A\u040B\u040C\xAD\u040E\u040F' - '\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417' - '\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F' - '\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427' - '\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F' - '\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437' - '\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F' - '\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447' - '\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F' - '\u2116\u0451\u0452\u0453\u0454\u0455\u0456\u0457' - '\u0458\u0459\u045A\u045B\u045C\xA7\u045E\u045F'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0401\u0402\u0403\u0404\u0405\u0406\u0407' + /* 0xA8..0xAF */ '\u0408\u0409\u040A\u040B\u040C\u00AD\u040E\u040F' + /* 0xB0..0xB7 */ '\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417' + /* 0xB8..0xBF */ '\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F' + /* 0xC0..0xC7 */ '\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427' + /* 0xC8..0xCF */ '\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F' + /* 0xD0..0xD7 */ '\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437' + /* 0xD8..0xDF */ '\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F' + /* 0xE0..0xE7 */ '\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447' + /* 0xE8..0xEF */ '\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F' + /* 0xF0..0xF7 */ '\u2116\u0451\u0452\u0453\u0454\u0455\u0456\u0457' + /* 0xF8..0xFF */ '\u0458\u0459\u045A\u045B\u045C\u00A7\u045E\u045F'; // Characters of ISO-8859-6. +// Mapping table version: 2.0 const iso8859_6 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-6.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\uFFFD\uFFFD\uFFFD\xA4\uFFFD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\u060C\xAD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\u061B\uFFFD\uFFFD\uFFFD\u061F' - '\uFFFD\u0621\u0622\u0623\u0624\u0625\u0626\u0627' - '\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F' - '\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637' - '\u0638\u0639\u063A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' - '\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647' - '\u0648\u0649\u064A\u064B\u064C\u064D\u064E\u064F' - '\u0650\u0651\u0652\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\uFFFD\uFFFD\uFFFD\u00A4\uFFFD\uFFFD\uFFFD' + /* 0xA8..0xAF */ '\uFFFD\uFFFD\uFFFD\uFFFD\u060C\u00AD\uFFFD\uFFFD' + /* 0xB0..0xB7 */ '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' + /* 0xB8..0xBF */ '\uFFFD\uFFFD\uFFFD\u061B\uFFFD\uFFFD\uFFFD\u061F' + /* 0xC0..0xC7 */ '\uFFFD\u0621\u0622\u0623\u0624\u0625\u0626\u0627' + /* 0xC8..0xCF */ '\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F' + /* 0xD0..0xD7 */ '\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637' + /* 0xD8..0xDF */ '\u0638\u0639\u063A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' + /* 0xE0..0xE7 */ '\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647' + /* 0xE8..0xEF */ '\u0648\u0649\u064A\u064B\u064C\u064D\u064E\u064F' + /* 0xF0..0xF7 */ '\u0650\u0651\u0652\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' + /* 0xF8..0xFF */ '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD'; // Characters of ISO-8859-7. +// Mapping table version: 3.0 const iso8859_7 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-7.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u2018\u2019\xA3\u20AC\u20AF\xA6\xA7' - '\xA8\xA9\u037A\xAB\xAC\xAD\uFFFD\u2015' - '\xB0\xB1\xB2\xB3\u0384\u0385\u0386\xB7' - '\u0388\u0389\u038A\xBB\u038C\xBD\u038E\u038F' - '\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397' - '\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F' - '\u03A0\u03A1\uFFFD\u03A3\u03A4\u03A5\u03A6\u03A7' - '\u03A8\u03A9\u03AA\u03AB\u03AC\u03AD\u03AE\u03AF' - '\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7' - '\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF' - '\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7' - '\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\uFFFD'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u2018\u2019\u00A3\u20AC\u20AF\u00A6\u00A7' + /* 0xA8..0xAF */ '\u00A8\u00A9\u037A\u00AB\u00AC\u00AD\uFFFD\u2015' + /* 0xB0..0xB7 */ '\u00B0\u00B1\u00B2\u00B3\u0384\u0385\u0386\u00B7' + /* 0xB8..0xBF */ '\u0388\u0389\u038A\u00BB\u038C\u00BD\u038E\u038F' + /* 0xC0..0xC7 */ '\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397' + /* 0xC8..0xCF */ '\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F' + /* 0xD0..0xD7 */ '\u03A0\u03A1\uFFFD\u03A3\u03A4\u03A5\u03A6\u03A7' + /* 0xD8..0xDF */ '\u03A8\u03A9\u03AA\u03AB\u03AC\u03AD\u03AE\u03AF' + /* 0xE0..0xE7 */ '\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7' + /* 0xE8..0xEF */ '\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF' + /* 0xF0..0xF7 */ '\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7' + /* 0xF8..0xFF */ '\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\uFFFD'; // Characters of ISO-8859-8. +// Mapping table version: 2.0 const iso8859_8 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-8.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\uFFFD\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xD7\xAB\xAC\xAD\xAE\xAF' - '\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xF7\xBB\xBC\xBD\xBE\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' - '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2017' - '\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7' - '\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF' - '\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7' - '\u05E8\u05E9\u05EA\uFFFD\uFFFD\u200E\u200F\uFFFD'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\uFFFD\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7' + /* 0xA8..0xAF */ '\u00A8\u00A9\u00D7\u00AB\u00AC\u00AD\u00AE\u00AF' + /* 0xB0..0xB7 */ '\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7' + /* 0xB8..0xBF */ '\u00B8\u00B9\u00F7\u00BB\u00BC\u00BD\u00BE\uFFFD' + /* 0xC0..0xC7 */ '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' + /* 0xC8..0xCF */ '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' + /* 0xD0..0xD7 */ '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD' + /* 0xD8..0xDF */ '\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2017' + /* 0xE0..0xE7 */ '\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7' + /* 0xE8..0xEF */ '\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF' + /* 0xF0..0xF7 */ '\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7' + /* 0xF8..0xFF */ '\u05E8\u05E9\u05EA\uFFFD\uFFFD\u200E\u200F\uFFFD'; // Characters of ISO-8859-9. +// Mapping table version: 2.0 const iso8859_9 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-9.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF' - '\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF' - '\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF' - '\u011E\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\u0130\u015E\xDF' - '\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF' - '\u011F\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\u0131\u015F\xFF'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7' + /* 0xA8..0xAF */ '\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF' + /* 0xB0..0xB7 */ '\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7' + /* 0xB8..0xBF */ '\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF' + /* 0xC0..0xC7 */ '\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7' + /* 0xC8..0xCF */ '\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF' + /* 0xD0..0xD7 */ '\u011E\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7' + /* 0xD8..0xDF */ '\u00D8\u00D9\u00DA\u00DB\u00DC\u0130\u015E\u00DF' + /* 0xE0..0xE7 */ '\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7' + /* 0xE8..0xEF */ '\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF' + /* 0xF0..0xF7 */ '\u011F\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7' + /* 0xF8..0xFF */ '\u00F8\u00F9\u00FA\u00FB\u00FC\u0131\u015F\u00FF'; // Characters of ISO-8859-10. +// Mapping table version: 2.0 const iso8859_10 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-10.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0104\u0112\u0122\u012A\u0128\u0136\xA7' - '\u013B\u0110\u0160\u0166\u017D\xAD\u016A\u014A' - '\xB0\u0105\u0113\u0123\u012B\u0129\u0137\xB7' - '\u013C\u0111\u0161\u0167\u017E\u2015\u016B\u014B' - '\u0100\xC1\xC2\xC3\xC4\xC5\xC6\u012E\u010C\xC9\u0118\xCB\u0116\xCD\xCE\xCF' - '\xD0\u0145\u014C\xD3\xD4\xD5\xD6\u0168\xD8\u0172\xDA\xDB\xDC\xDD\xDE\xDF' - '\u0101\xE1\xE2\xE3\xE4\xE5\xE6\u012F\u010D\xE9\u0119\xEB\u0117\xED\xEE\xEF' - '\xF0\u0146\u014D\xF3\xF4\xF5\xF6\u0169\xF8\u0173\xFA\xFB\xFC\xFD\xFE\u0138'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0104\u0112\u0122\u012A\u0128\u0136\u00A7' + /* 0xA8..0xAF */ '\u013B\u0110\u0160\u0166\u017D\u00AD\u016A\u014A' + /* 0xB0..0xB7 */ '\u00B0\u0105\u0113\u0123\u012B\u0129\u0137\u00B7' + /* 0xB8..0xBF */ '\u013C\u0111\u0161\u0167\u017E\u2015\u016B\u014B' + /* 0xC0..0xC7 */ '\u0100\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u012E' + /* 0xC8..0xCF */ '\u010C\u00C9\u0118\u00CB\u0116\u00CD\u00CE\u00CF' + /* 0xD0..0xD7 */ '\u00D0\u0145\u014C\u00D3\u00D4\u00D5\u00D6\u0168' + /* 0xD8..0xDF */ '\u00D8\u0172\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF' + /* 0xE0..0xE7 */ '\u0101\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u012F' + /* 0xE8..0xEF */ '\u010D\u00E9\u0119\u00EB\u0117\u00ED\u00EE\u00EF' + /* 0xF0..0xF7 */ '\u00F0\u0146\u014D\u00F3\u00F4\u00F5\u00F6\u0169' + /* 0xF8..0xFF */ '\u00F8\u0173\u00FA\u00FB\u00FC\u00FD\u00FE\u0138'; // Characters of ISO-8859-11. +// Mapping table version: 2.0 const iso8859_11 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-11.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07' - '\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F' - '\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17' - '\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F' - '\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27' - '\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F' - '\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37' - '\u0E38\u0E39\u0E3A\uFFFD\uFFFD\uFFFD\uFFFD\u0E3F' - '\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47' - '\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F' - '\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57' - '\u0E58\u0E59\u0E5A\u0E5B\uFFFD\uFFFD\uFFFD\uFFFD'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07' + /* 0xA8..0xAF */ '\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F' + /* 0xB0..0xB7 */ '\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17' + /* 0xB8..0xBF */ '\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F' + /* 0xC0..0xC7 */ '\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27' + /* 0xC8..0xCF */ '\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F' + /* 0xD0..0xD7 */ '\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37' + /* 0xD8..0xDF */ '\u0E38\u0E39\u0E3A\uFFFD\uFFFD\uFFFD\uFFFD\u0E3F' + /* 0xE0..0xE7 */ '\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47' + /* 0xE8..0xEF */ '\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F' + /* 0xF0..0xF7 */ '\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57' + /* 0xF8..0xFF */ '\u0E58\u0E59\u0E5A\u0E5B\uFFFD\uFFFD\uFFFD\uFFFD'; // Characters of ISO-8859-13. +// Mapping table version: 2.0 const iso8859_13 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-13.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u201D\xA2\xA3\xA4\u201E\xA6\xA7\xD8\xA9\u0156\xAB\xAC\xAD\xAE\xC6' - '\xB0\xB1\xB2\xB3\u201C\xB5\xB6\xB7\xF8\xB9\u0157\xBB\xBC\xBD\xBE\xE6' - '\u0104\u012E\u0100\u0106\xC4\xC5\u0118\u0112' - '\u010C\xC9\u0179\u0116\u0122\u0136\u012A\u013B' - '\u0160\u0143\u0145\xD3\u014C\xD5\xD6\xD7' - '\u0172\u0141\u015A\u016A\xDC\u017B\u017D\xDF' - '\u0105\u012F\u0101\u0107\xE4\xE5\u0119\u0113' - '\u010D\xE9\u017A\u0117\u0123\u0137\u012B\u013C' - '\u0161\u0144\u0146\xF3\u014D\xF5\xF6\xF7' - '\u0173\u0142\u015B\u016B\xFC\u017C\u017E\u2019'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u201D\u00A2\u00A3\u00A4\u201E\u00A6\u00A7' + /* 0xA8..0xAF */ '\u00D8\u00A9\u0156\u00AB\u00AC\u00AD\u00AE\u00C6' + /* 0xB0..0xB7 */ '\u00B0\u00B1\u00B2\u00B3\u201C\u00B5\u00B6\u00B7' + /* 0xB8..0xBF */ '\u00F8\u00B9\u0157\u00BB\u00BC\u00BD\u00BE\u00E6' + /* 0xC0..0xC7 */ '\u0104\u012E\u0100\u0106\u00C4\u00C5\u0118\u0112' + /* 0xC8..0xCF */ '\u010C\u00C9\u0179\u0116\u0122\u0136\u012A\u013B' + /* 0xD0..0xD7 */ '\u0160\u0143\u0145\u00D3\u014C\u00D5\u00D6\u00D7' + /* 0xD8..0xDF */ '\u0172\u0141\u015A\u016A\u00DC\u017B\u017D\u00DF' + /* 0xE0..0xE7 */ '\u0105\u012F\u0101\u0107\u00E4\u00E5\u0119\u0113' + /* 0xE8..0xEF */ '\u010D\u00E9\u017A\u0117\u0123\u0137\u012B\u013C' + /* 0xF0..0xF7 */ '\u0161\u0144\u0146\u00F3\u014D\u00F5\u00F6\u00F7' + /* 0xF8..0xFF */ '\u0173\u0142\u015B\u016B\u00FC\u017C\u017E\u2019'; // Characters of ISO-8859-14. +// Mapping table version: 2.0 const iso8859_14 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-14.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u1E02\u1E03\xA3\u010A\u010B\u1E0A\xA7' - '\u1E80\xA9\u1E82\u1E0B\u1EF2\xAD\xAE\u0178' - '\u1E1E\u1E1F\u0120\u0121\u1E40\u1E41\xB6\u1E56' - '\u1E81\u1E57\u1E83\u1E60\u1EF3\u1E84\u1E85\u1E61' - '\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF' - '\u0174\xD1\xD2\xD3\xD4\xD5\xD6\u1E6A\xD8\xD9\xDA\xDB\xDC\xDD\u0176\xDF' - '\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF' - '\u0175\xF1\xF2\xF3\xF4\xF5\xF6\u1E6B\xF8\xF9\xFA\xFB\xFC\xFD\u0177\xFF'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u1E02\u1E03\u00A3\u010A\u010B\u1E0A\u00A7' + /* 0xA8..0xAF */ '\u1E80\u00A9\u1E82\u1E0B\u1EF2\u00AD\u00AE\u0178' + /* 0xB0..0xB7 */ '\u1E1E\u1E1F\u0120\u0121\u1E40\u1E41\u00B6\u1E56' + /* 0xB8..0xBF */ '\u1E81\u1E57\u1E83\u1E60\u1EF3\u1E84\u1E85\u1E61' + /* 0xC0..0xC7 */ '\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7' + /* 0xC8..0xCF */ '\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF' + /* 0xD0..0xD7 */ '\u0174\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u1E6A' + /* 0xD8..0xDF */ '\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u0176\u00DF' + /* 0xE0..0xE7 */ '\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7' + /* 0xE8..0xEF */ '\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF' + /* 0xF0..0xF7 */ '\u0175\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u1E6B' + /* 0xF8..0xFF */ '\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u0177\u00FF'; // Characters of ISO-8859-15. +// Mapping table version: 2.0 const iso8859_15 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-15.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\xA1\xA2\xA3\u20AC\xA5\u0160\xA7\u0161\xA9\xAA\xAB\xAC\xAD\xAE\xAF' - '\xB0\xB1\xB2\xB3\u017D\xB5\xB6\xB7\u017E\xB9\xBA\xBB\u0152\u0153\u0178\xBF' - '\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF' - '\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF' - '\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF' - '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u00A1\u00A2\u00A3\u20AC\u00A5\u0160\u00A7' + /* 0xA8..0xAF */ '\u0161\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF' + /* 0xB0..0xB7 */ '\u00B0\u00B1\u00B2\u00B3\u017D\u00B5\u00B6\u00B7' + /* 0xB8..0xBF */ '\u017E\u00B9\u00BA\u00BB\u0152\u0153\u0178\u00BF' + /* 0xC0..0xC7 */ '\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7' + /* 0xC8..0xCF */ '\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF' + /* 0xD0..0xD7 */ '\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7' + /* 0xD8..0xDF */ '\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF' + /* 0xE0..0xE7 */ '\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7' + /* 0xE8..0xEF */ '\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF' + /* 0xF0..0xF7 */ '\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7' + /* 0xF8..0xFF */ '\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF'; // Characters of ISO-8859-16. +// Mapping table version: 2.0 const iso8859_16 = // From https://unicode.org/Public/MAPPINGS/ISO8859/8859-16.TXT - '\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F' - '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' - ' !"#\$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' - '`abcdefghijklmnopqrstuvwxyz{|}~\x7F' - '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F' - '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F' - '\xA0\u0104\u0105\u0141\u20AC\u201E\u0160\xA7' - '\u0161\xA9\u0218\xAB\u0179\xAD\u017A\u017B' - '\xB0\xB1\u010C\u0142\u017D\u201D\xB6\xB7' - '\u017E\u010D\u0219\xBB\u0152\u0153\u0178\u017C' - '\xC0\xC1\xC2\u0102\xC4\u0106\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF' - '\u0110\u0143\xD2\xD3\xD4\u0150\xD6\u015A' - '\u0170\xD9\xDA\xDB\xDC\u0118\u021A\xDF\xE0\xE1\xE2\u0103\xE4\u0107\xE6\xE7' - '\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\u0111\u0144\xF2\xF3\xF4\u0151\xF6\u015B' - '\u0171\xF9\xFA\xFB\xFC\u0119\u021B\xFF'; + /* 0x00..0x07 */ '\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007' + /* 0x08..0x0F */ '\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F' + /* 0x10..0x17 */ '\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017' + /* 0x18..0x1F */ '\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F' + /* 0x20..0x27 */ '\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027' + /* 0x28..0x2F */ '\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F' + /* 0x30..0x37 */ '\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037' + /* 0x38..0x3F */ '\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F' + /* 0x40..0x47 */ '\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047' + /* 0x48..0x4F */ '\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F' + /* 0x50..0x57 */ '\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057' + /* 0x58..0x5F */ '\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F' + /* 0x60..0x67 */ '\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067' + /* 0x68..0x6F */ '\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F' + /* 0x70..0x77 */ '\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077' + /* 0x78..0x7F */ '\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F' + /* 0x80..0x87 */ '\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087' + /* 0x88..0x8F */ '\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F' + /* 0x90..0x97 */ '\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097' + /* 0x98..0x9F */ '\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F' + /* 0xA0..0xA7 */ '\u00A0\u0104\u0105\u0141\u20AC\u201E\u0160\u00A7' + /* 0xA8..0xAF */ '\u0161\u00A9\u0218\u00AB\u0179\u00AD\u017A\u017B' + /* 0xB0..0xB7 */ '\u00B0\u00B1\u010C\u0142\u017D\u201D\u00B6\u00B7' + /* 0xB8..0xBF */ '\u017E\u010D\u0219\u00BB\u0152\u0153\u0178\u017C' + /* 0xC0..0xC7 */ '\u00C0\u00C1\u00C2\u0102\u00C4\u0106\u00C6\u00C7' + /* 0xC8..0xCF */ '\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF' + /* 0xD0..0xD7 */ '\u0110\u0143\u00D2\u00D3\u00D4\u0150\u00D6\u015A' + /* 0xD8..0xDF */ '\u0170\u00D9\u00DA\u00DB\u00DC\u0118\u021A\u00DF' + /* 0xE0..0xE7 */ '\u00E0\u00E1\u00E2\u0103\u00E4\u0107\u00E6\u00E7' + /* 0xE8..0xEF */ '\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF' + /* 0xF0..0xF7 */ '\u0111\u0144\u00F2\u00F3\u00F4\u0151\u00F6\u015B' + /* 0xF8..0xFF */ '\u0171\u00F9\u00FA\u00FB\u00FC\u0119\u021B\u00FF'; // -- END GENERATED CONTENT -- diff --git a/pubspec.yaml b/pubspec.yaml index 5b43b39..58eca85 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: convert -version: 4.0.0-dev +version: 3.2.0-dev description: >- Utilities for converting between data representations. Provides a number of Sink, Codec, Decoder, and Encoder types. @@ -15,4 +15,5 @@ dev_dependencies: benchmark_harness: ^2.2.0 dart_flutter_team_lints: ^1.0.0 path: ^1.8.0 + http: ^1.1.0 test: ^1.17.0 diff --git a/tools/update_unicode_iso8859_tables.dart b/tools/update_unicode_iso8859_tables.dart index 01a09d0..aa95be1 100644 --- a/tools/update_unicode_iso8859_tables.dart +++ b/tools/update_unicode_iso8859_tables.dart @@ -9,12 +9,12 @@ // // Updates the definitions in `lib/src/codepages/unicode_iso8859.g.dart`, // between the `// -- BEGIN GENERATED CONTENT --` and -// `// -- END GENERATED CONTENT --` markers, or inserts such a block at the -// end of the file. +// `// -- END GENERATED CONTENT --` markers, +// or inserts such a block at the end of the file. -import 'dart:convert'; import 'dart:io'; +import 'package:http/http.dart' as http; import 'package:path/path.dart' as p; /// The directory of this script. Used as base for other relative paths. @@ -52,9 +52,16 @@ void main(List args) async { var tableFileContent = tableFile.readAsStringSync(); // Generate new declarations. + // Fetches table files, parses them, and creates new constant declarations. var declarations = await generateTables(); // Find generated content markers in existing file. + // + // Matches everything from [generatedContentLead] to the end of the + // line containing [generatedContentTail]. + // Has a submatch for the lines after a first "// Generated" comment + // line (which contains the generated date), to be checked against + // newly generated content, to see if there is any change. var generatedContentMatch = RegExp('$generatedContentLead' r'.*\r?\n(?:// Generated.*\r?\n)?([^]*?\r?\n)' '$generatedContentTail' @@ -63,14 +70,21 @@ void main(List args) async { .firstMatch(tableFileContent)!; var existingDeclarations = generatedContentMatch[1] ?? ''; + // Whether the existing content contains windows line endings. + var windowsLineEndings = existingDeclarations.contains('\r\n'); + if (windowsLineEndings) { + existingDeclarations = existingDeclarations.replaceAll('\r\n', '\n'); + } if (declarations == existingDeclarations) { - // If no change, no write. + // If no change, don't write the file, to retain the prior generation + // date and time. stderr.writeln('No changes'); return; } - var replacement = replacementString(declarations); - // Guess file's newline, change to '\r\n' if necessary. - if (Platform.isWindows && tableFileContent.contains('\r\n')) { + // Add markers before and after the declarations. + var replacement = wrapInGeneratedContentMarkers(declarations); + // Convert to the detected line endings of the input, if necessary. + if (windowsLineEndings) { replacement = replacement.replaceAll('\n', '\r\n'); } tableFileContent = tableFileContent.replaceRange( @@ -82,7 +96,7 @@ void main(List args) async { /// Shared HTTP client used by [fetchTable], initialized if needed. /// /// Closed by [generateTables] when done fetching. -HttpClient? httpClient; +http.Client? httpClient; /// Fetches table file content, parses and builds constant string declarations. Future generateTables() async { @@ -109,88 +123,42 @@ Future generateTables() async { /// Generates the constant string for a single ISO-8859 code page. Future generateTableFor(StringSink buffer, int isoNumber) async { var (uri, content) = await fetchTable(isoNumber); + + var versionMatch = tableVersionRE.firstMatch(content); + if (versionMatch == null) { + throw FormatException( + 'Missing header fields, table version and format', content); + } + if (versionMatch[2] != expectedTableFormat) { + throw FormatException('Unexpected format: $versionMatch[2]', content); + } + var version = versionMatch[1]; + var text = parseTable(isoNumber, content); buffer ..writeln() ..writeln('// Characters of ISO-8859-$isoNumber.') + ..writeln('// Mapping table version: $version') ..write('const iso8859_$isoNumber = // From $uri'); // Write 8 chars per line, as Unicode escapes. + const charsPerLine = 8; for (var i = 0; i < text.length;) { - var charsOnLine = nextRangeLength(text, i, 74); - buffer.write('\n \''); - for (var c = 0; c < charsOnLine; c++) { - writeChar(buffer, text.codeUnitAt(i + c)); + buffer.write( + '\n /* 0x${hex(i, 2)}..0x${hex(i + charsPerLine - 1, 2)} */ \''); + for (var c = 0; c < charsPerLine; c++) { + buffer + ..write(r'\u') + ..write(hex(text.codeUnitAt(i + c), 4)); } - i += charsOnLine; buffer.write('\''); + i += charsPerLine; } buffer.writeln(';'); } -// Code units that are encoded specially in the generated literals. -const specialChars = { - 0x08: r'\b', - 0x09: r'\t', - 0x0a: r'\n', - 0x0b: r'\v', - 0x0c: r'\f', - 0x0d: r'\r', - 0x24: r'\$', - 0x27: r"\'", - 0x7f: r'\x7F', - 0x5c: r'\\', -}; - -/// Write a single code unit into a string literal. -/// -/// Writes all code units above 0xFF as `\uHHHH`. -/// Writes all printable ASCII codes as themselves, -/// possibly escaped. -/// Writes characters that have escapes, like `\n`, as those. -/// The remaining code units in the 0x00..0xFF range are written as `\xHH` -void writeChar(StringSink buffer, int charCode) { - if (specialChars[charCode] case var s?) { - buffer.write(s); - } else if (charCode >= 0x20 && charCode < 0x7f) { - buffer.writeCharCode(charCode); - } else if (charCode <= 0xFF) { - buffer - ..write(charCode < 0x10 ? r'\x0' : r'\x') - ..write(charCode.toRadixString(16).toUpperCase()); - } else { - buffer - ..write(r'\u') - ..write(charCode.toRadixString(16).toUpperCase().padLeft(4, '0')); - } -} - -/// Find the number of characters that fits in a single-line string literal. -/// -/// Finds the largest number of characters starting from [from], -/// which is a power of 2, and where the characters representation, -/// as written by [writeChar], fits within [maxLength] characters. -int nextRangeLength(String text, int from, int maxLength) { - var best = 8; - assert(best * 6 <= maxLength); - var length = 0; - var count = 0; - for (var i = from; i < text.length; i++) { - var c = text.codeUnitAt(i); - length += specialChars[c]?.length ?? - (c < 0x20 // Low-ACSII control code: \xHH - ? 4 - : c < 0x7f // Other visible ASCII: itself. - ? 1 - : c < 0x100 // 0x7f..0xff: \xHH - ? 4 - : 6); // Above: /uHHHH. - count += 1; - if (length > maxLength) return best; - var isPowerOf2 = count & (count - 1) == 0; - if (isPowerOf2 && count > best) best = count; - } - return count; // Rest of string. -} +/// Formats positive integer as [digits]-digit base 16, left-padded with `0`. +String hex(int number, int digits) => + number.toRadixString(16).toUpperCase().padLeft(digits, '0'); /// Fetches table file content for ISO-8859-*n*. /// @@ -224,6 +192,17 @@ Future<(Uri, String)> fetchTable(int n) async { final tableCharMappingRE = RegExp(multiLine: true, r'^0x([\dA-F]{2})\t0x([\dA-F]{4})(?:\t#.*)?$'); +/// Pattern matching the table version and format headers in the table format. +final tableVersionRE = RegExp( + multiLine: true, + r'^#\s+Table version:\s+(\d+\.\d+)\s*' + r'^#\s+Table format:\s*(\w.*\w)\s*$'); + +/// The format of the tables currently supported. +/// +/// Bail out if something else is encountered. +const expectedTableFormat = 'Format A'; + /// Parses table content. /// /// Assumed to start with the file name, '# 8859-n.TXT`. @@ -241,7 +220,6 @@ String parseTable(int expectedNumber, String table) { if (!table.startsWith('# 8859-$expectedNumber.TXT')) { throw FormatException('Not table for ISO-8859-$expectedNumber', table, 0); } - const replacementChar = 0xFFFD; var encoding = List.filled(256, replacementChar); var count = 0; @@ -271,14 +249,14 @@ String parseTable(int expectedNumber, String table) { /// /// Nothing fancy accepted, must return [HttpStatus.ok]. Future httpGetString(Uri uri) async { - var client = httpClient ??= HttpClient(); - var request = await client.getUrl(uri); - var response = await request.close(); + var client = httpClient ??= http.Client(); + var response = await client.get(uri); if (response.statusCode != HttpStatus.ok) { - throw HttpException('Cannot fetch (${response.statusCode})', uri: uri); + throw HttpException( + 'Cannot fetch (${response.reasonPhrase ?? response.statusCode})', + uri: uri); } - // ignore: unnecessary_await_in_return - return await response.transform(const Utf8Decoder()).join(); + return response.body; } /// Builds the complete replacement for the generated section. @@ -287,7 +265,7 @@ Future httpGetString(Uri uri) async { /// in new generated content markers and a "generated when and by" /// comment, which can replace the existing generated content section /// of the table file. -String replacementString(String declarations) => ''' +String wrapInGeneratedContentMarkers(String declarations) => ''' $generatedContentLead // Generated (${nowTime()}) by tools/update_unicode_iso8859_tables.dart $declarations$generatedContentTail