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);
In reply to Re^4: JSON and utf8 flag
by ikegami
in thread JSON and utf8 flag
by Nick Kostirya
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |