First of all, the UTF8 flag is irrelevant. I believe you are actually complaining that $smile ne $d->[0].
Secondly, you claim your source code includes the following:
my $smile = "☻";
That's not possible unless you have use utf8;. You actually have the following:
my $s_orig = "\xE2\x98\xBB";
If interpreted as Unicode Code Points (as ->encode does), you have LATIN SMALL LETTER A WITH CIRCUMFLEX, followed by START OF STRING, followed by RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK.
Finally, how to round trip:
use Test::More tests => 1;
use JSON::XS qw( decode_json encode_json );
my $s_orig = "\xE2\x98\xBB";
my $data_orig = [ $s_orig ];
my $json_utf8 = encode_json($data_orig);
my $data_got = decode_json($json_utf8);
my $s_got = $data_got->[0];
is($s_got, $s_orig);
If you actually want to store a smile,
use Test::More tests => 1;
use JSON::XS qw( decode_json encode_json );
my $smile_utf8 = "\xE2\x98\xBB";
utf8::decode( my $s_orig = my $smile_utf8 );
my $data_orig = [ $s_orig ];
my $json_utf8 = encode_json($data_orig);
my $data_got = decode_json($json_utf8);
my $s_got = $data_got->[0];
is($s_got, $s_orig);
|