use strict; use warnings; use Test::More; use Data::Recursive::Encode; use Encode; # utility functions sub U($) { decode_utf8($_[0]) } sub u($) { encode_utf8($_[0]) } sub E($) { decode('euc-jp', $_[0]) } sub e($) { encode('euc-jp', $_[0]) } sub eU($) { e(U($_[0])) } # ------------------------------------------------------------------------- my $E = sub { Data::Recursive::Encode->encode_utf8(@_) }; my $data = { 'foo' => { key => U('ã‚ã„ã†'), qux => 42 } }; $data->{bar} = $data->{foo}; my $got = Data::Recursive::Encode->encode_utf8($data); is $got->{bar}->{qux}, 42; is $got->{bar}->{key}, 'ã‚ã„ã†'; $got->{foo}{qux}++; is $got->{bar}{qux}, 43, 'cyclic refs'; ok !utf8::is_utf8($got->{foo}->{key}); done_testing;