use strict ; use warnings ; use Encode qw(_utf8_on) ; for my $r ("\xC2\xAB \x61\x68\x61 \xC2\xBB", "\xC2\x7E \x61\x68\x61 \x80\xC0") { for my $utf (0..1) { _utf8_on($r) if $utf ; printf "'%s', %d/%d %s\n", raw(unpack('a*', $r)) ; } ; } ; sub raw { my ($s) = @_ ; my ($b, $q) ; { use bytes ; $b = length($s) ; $q = join '', map { ($_ >= 0x20) && ($_ <= 0x7E) ? chr($_) : sprintf('\\x%02X', $_) } unpack('C*', $s) ; } ; return ($q, length($s), $b, utf8::is_utf8($s) ? 'utf8' : 'not utf8') ; } ;