in reply to WWW::Dict::Leo::Org encoding issue

your code:
open (OUT, "output.txt"); binmode(OUT, ":utf8"); print OUT Dumper(\@matches); close OUT;
looks like you are opening OUT for read access, then trying to write to it. And you're not checking for any errors, so when something goes wrong, you don't hear about it.

So, your script is not changing the contents of the file. Try opening for write access -- the nicest way would be:

open( OUT, ">:utf8", "output.txt" ) or die "output.txt: $!\n";
BTW, I think Data::Dumper will make sure to convert unicode characters to their "\x{h*}" form, rather than printing actual utf8-encoded byte strings.

ikegami's point about printing a BOM character first is simply that many tools (including Notepad, Wordpad and other M$ utils) rely on a file-initial BOM as a sort of "magic word" that tells the tool how it should interpret the file contents. So, after the kind of open statement shown above, I would do:

print OUT "\x{feff}\n"; # and then print all the utf8 text content...