#It gives weird result: $text =~ s/\\u(.{4})/pack('u', $1)/ge; $text =~ s/\\u(.{4})/pack('U', $1)/ge; #Says, nonnumeric argument: $text =~ s/\\u(.{4})/pack('u', "0x$1")/ge; $text =~ s/\\u(.{4})/pack('U', "0x$1")/ge; $text =~ s/\\u(.{4})/chr("0x$1")/ge; #Just stays as a changed string (\x{00e9}, \x{00f3}, \x{00e1}, #or with \0x{....}), doesn't interpolate: $text =~ s/\\u(.{4})/\\x{$1}/g; $text =~ s/\\u(.{4})/\\0x{$1}/g; #does not change anything: use Text::Unidecode; $text =~ s/\\u(.{4})/unidecode($1)/ge;