use feature ":5.14"; use warnings FATAL => qw(all); use strict; use Data::Dump qw(dump pp); use XML::Simple; sub readUnicode($) {my ($f) = @_; open(my $F, "<:encoding(UTF-16)", $f) or die "Cannot open $f for unicode input"; local $/ = undef; <$F>; } sub writeUnicode($$) {my ($f, $s) = @_; open(my $F, ">:encoding(UTF-16)", $f) or die "Cannot open $f for unicode output"; say {$F} $s; } my $x = XMLin(readUnicode("some file containing XML")); $x->{foo}{bar} = "new value"; my $X = XMLout($x); writeUnicode("output file name", $X);