use strict; use warnings; use Encode; my $enc_flags = Encode::FB_CROAK | Encode::LEAVE_SRC; binmode STDOUT, ':encoding(utf-8)'; while ( my $line = <> ) { chomp $line; my $decoded = eval { Encode::decode( 'utf-8', $line, $enc_flags ); } || bad_string( $line ); print $decoded, "\n"; } sub bad_string { # "upgrade" the string Encode::decode( 'latin-1', shift ); }