JSON形式のマルチバイト文字(UTF16)をUTF8変換する

JSON系モジュールを使わずに直接まともに見れる形に変換したいが、なかなか情報がなかった。

use Encode;

## test
print encode("UTF-8", "\x{3042}"); ## "あ"

## 変換したいUTF16な文字列
my $str = '\u3042';

$str =~ s/\\u(:xdigit:{4})/chr eval "0x$1"/eg;
$str = encode("UTF-8", $str);
print "$str¥n"; ## "あ"

参考:
utf16の記号のutf8へのエンコード(もしくはマッチ又は削除)がう - Perl | 教えて!goo