use Encode; sub digConvert { my $ref = shift; if (ref $ref eq 'HASH') { foreach (keys %$ref) { $ref->{$_} = digConvert($ref->{$_}); } } elsif (ref $ref eq 'ARRAY') { foreach my $i (0 .. $#{$ref}) { $ref->[$i] = digConvert($ref->[$i]); } } elsif (ref $ref eq '' && $ref) { # don't upset XML parser # problably more to come $ref =~ s/&/&/g; $ref = Encode::encode_utf8($ref); } else { ### something I missed? } return $ref; }