... s{([^\0-\177])}{N_escape($1)}eg; ... sub N_escape { my $n = charnames::viacode(ord($_[0])); return defined($n) ? "\\N{$n}" : sprintf('\x{%x}', ord($_[0])); } ...