use charnames ':full'; { my %escapes = ( '&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => ''', ); sub xml_text { (my $s = $_[0]) =~ s/([<&])/$escapes{$1}/g; $s } sub xml_att_val { (my $s = $_[0]) =~ s/([<&"])/$escapes{$1}/g; qq{"$s"} } } my $s_7bit = "A"; my $s_8bit = "\N{LATIN CAPITAL LETTER A WITH CIRCUMFLEX}"; my $s_32bit = "\N{BLACK SPADE SUIT}"; #### open(my $fh, '>:encoding(UTF-8)', $qfn) or die; print($fh qq{\n}); print($fh qq{\n}); print($fh qq{ }, xml_text($s_7bit), qq{\n}); print($fh qq{ }, xml_text($s_8bit), qq{\n}); print($fh qq{ }, xml_text($s_32bit), qq{\n}); print($fh qq{\n});