#!/usr/bin/perl use v5.10; use strict; use warnings; use Encode 2.12 qw(); my $octets="a\xFEb"; # ^-- byte 0xFE ist invalid in UTF-8, see https://en.wikipedia.org/wiki/Utf-8 my $string=Encode::decode( 'utf-8', $octets, sub { my $value=shift; return sprintf('<0x%04X>',$value); } ); say $string; $string="a\x{123456}b"; # ^-- Unicode is defined from 0 to 0x10FFFF $octets=Encode::encode( 'utf-8', $string, sub { my $value=shift; return sprintf('<0x%08X>',$value); } ); say $octets; $string="a\x{00C4}b\x{263A}c"; # a A-Umlaut b Smile c # ^-- not available in ISO-8859-1 $octets=Encode::encode( 'utf-8', $string, sub { die "Should not happen"; } ); # from_to() converts bytes, not characters. To make things easier, # I use a destination encoding where 1 byte = 1 character. Encode::from_to( $octets, # in-place 'utf-8', 'iso-8859-1', sub { my $value=shift; return sprintf('<0x%04X>',$value); } ); binmode STDOUT,':encoding(utf-8)'; # I use a UTF-8 terminal say $octets; # implicit converting from ISO-8859-1 to UTF-8 due to binmode above