$octets = encode("utf8", $string); #### use Encode qw( encode ); sub string_to_literal { local $_ = @_ ? $_[0] : $_; s/(.)/ my $o = ord($1); if ($1 eq '"' ) { '\\"' } elsif ($1 eq '\\' ) { '\\\\' } elsif ($1 < 0x20 || $1 >= 0x7F) { sprintf('\\x{%X}', $o) } else { $1 } /eg; return qq{"$_"}; } sub octet_dump { return join ' ', map { sprintf('%02X', ord($_)) } map /(.)/g, @_ ? $_[0] : $_; } $string = "\x{03c5}"; print("\$string is ", length($string), " chars long: "); print(string_to_literal($string), "\n"); $octets = encode("utf8", $string); print("\$octets is ", length($octets), " bytes long: "); print(octet_dump($octets), "\n"); #### $string is 1 chars long: "\x{3C5}" $octets is 2 bytes long: CF 85