- if ($input =~ /^U([0-9a-f]+)(?:-([0-9a-f]+))?/) {
- my $start = hex($1) << ($2 ? 4 : 8);
- my $end = $2 ? hex($2) << 4 : $start + 240;
- $row{table} = join '', map { chr } $start .. $end+15;
- utf8::upgrade($row{table}); # prevent latin1 output
- $row{set} = sprintf 'Unicode block U+%02Xxx', $start >> 8;
- }
- elsif ($input eq 'U') {
- $row{table} = ' ' x 1024;
- $row{set} = 'Unicode planes';
- $row{cell} = do 'charset-ucplanes.inc.pl'
+sub tabinput {
+ # generate character table(s)
+ my $input = shift or return;
+
+ state $ALIAS = {
+ default => [qw( unicode+0-192 utf-8 iso-8859-1 cp1252+128-159 iso-8859-15+160-191 cp437 cp850+128 )],
+ us => [qw( cp437 cp863+128 AdobeStandardEncoding gsm0338+0-127 )],
+ ebcdic => [qw( cp37 cp500 cp875 cp1026 cp1047 posix-bc )],
+ westeur => [qw( iso-8859-1 iso-8859-15+160-191 cp1252+128-159 iso-8859-14+160 cp850+128 MacRoman+128 nextstep+128 hp-roman8+160 )],
+ centeur => [qw( iso-8859-2 iso-8859-16+160 cp1250+128 cp852+128 MacCentralEurRoman+128 MacCroatian+128 MacRomanian+128 )], # MacRumanian only for DB
+ turkish => [qw( iso-8859-3 iso-8859-9+128 cp857+128 cp1254+128 MacTurkish+128 )],
+ baltic => [qw( iso-8859-4 iso-8859-13+160 cp775+128 cp1257+128 )],
+ nordic => [qw( iso-8859-10 cp865+128 cp861+160-191 MacIcelandic+128 MacSami+160 )],
+ cyrillic => [qw( koi8-f koi8-r+128-192 koi8-u+160-192 iso-8859-5+128 cp1251+128 MacCyrillic+128 cp855+128 cp866+128 )], # MacUkrainian is broken
+ arabic => [qw( iso-8859-6 cp1006+160 cp864+128 cp1256+128 MacArabic )], # MacFarsi same as MacArabic?
+ greek => [qw( iso-8859-7 cp1253+128 MacGreek+128 cp737+128 cp869+128 )],
+ hebrew => [qw( iso-8859-8 cp1255+128 MacHebrew+128 cp862+128 )],
+ thai => [qw( iso-8859-11 cp874+128-159 MacThai+128 )],
+ vietnamese => [qw( viscii cp1258 MacVietnamese )],
+ symbol => [qw( symbol dingbats MacDingbats AdobeZdingbat AdobeSymbol )],
+ # iso-code shorthand
+ 1 => 'westeur',
+ 2 => 'centeur',
+ 3 => 'turkish',
+ 4 => 'baltic',
+ 5 => 'cyrillic',
+ 6 => 'arabic',
+ 7 => 'greek',
+ 8 => 'hebrew',
+ 9 => 'turkish',
+ 10 => 'nordic',
+ 11 => 'thai',
+ };
+ if (my $follow = $ALIAS->{$input}) {
+ tabinput($_) for ref $follow ? @{$follow} : $follow;
+ return;
+ }
+
+ my %row = (offset => 0, cols => 16);
+ my $endpoint = 255;
+ my $params = $input =~ s/[+](.*)\z// ? $1 : undef;
+
+ if (defined $params and $params =~ m/^ (\d+) (-\d+)? /x) {
+ $row{offset} = $1;
+ $endpoint = -$2 if $2;
+ }
+ if ($row{offset}) {
+ $row{setnote} = 'over cp437' if $input eq 'cp850';
+ $row{setnote} = 'over iso-8859-1' if $input =~ /^iso-8859-|^cp125/;
+ }
+
+ if ($input =~ /^U([0-9a-f]+)(?:-([0-9a-f]+))?/) {
+ my $start = hex($1) << ($2 ? 4 : 8);
+ my $end = $2 ? hex($2) << 4 : $start + 240;
+ $row{table} = join '', map { chr } $start .. $end+15;
+ utf8::upgrade($row{table}); # prevent latin1 output
+ $row{set} = sprintf 'Unicode block U+%02Xxx', $start >> 8;
+ }
+ elsif ($input eq 'U') {
+ $row{table} = ' ' x 1024;
+ $row{set} = 'Unicode planes';
+ $row{cell} = do 'charset-ucplanes.inc.pl'
+ or Alert('Table data could not be read', $@ || $!);
+ $row{cols} *= 2;
+ }
+ elsif ($row{set} = Encode::resolve_alias($input)) {
+ if ($row{set} eq 'Internal') {
+ $row{table} = ' ' x ($endpoint < 255 ? 640 : 8192);
+ $row{set} = 'Unicode BMP';
+ $row{cell} = do 'charset-unicode.inc.pl'