В Perl v5.10.1 мне нужно сравнить собственные структуры perl с символами юникода с аналогичными структурами, созданными JSON::decode_json
.
Пример:
use strict; use warnings;
#use utf8;
use JSON;
use Test::Deep qw(cmp_deeply);
cmp_deeply(["1"], JSON::decode_json('["1"]'), 'utf8 test 11'); # will pass
cmp_deeply(["≥"], JSON::decode_json('["1"]'), 'utf8 test ≥1'); # will fail
cmp_deeply(["1"], JSON::decode_json('["≥"]'), 'utf8 test 1≥'); # will fail
cmp_deeply(["≥"], JSON::decode_json('["≥"]'), 'utf8 test ≥≥'); # should pass
Я не могу объяснить, что происходит в последнем случае, почему две структуры не равны? Я попытался RTFM, что на самом деле не улучшило моего понимания проблемы.
Вот вывод (слегка отредактированный, так как TAP слишком многословен):
ok 1 - utf8 test 11
not ok 2 - utf8 test ≥1
# Compared $data->[0]
# got : '≥'
# expect : '1'
not ok 3 - utf8 test 1≥
Wide character in print at Test/Builder.pm line 1698.
# Compared $data->[0]
# got : '1'
# expect : '≥'
not ok 4 - utf8 test ≥≥
Wide character in print at Test/Builder.pm line 1698.
# Compared $data->[0]
# got : 'â¥'
# expect : '≥'
Когда я попробовал это с use utf8;
, было еще хуже (скрипт умер после 2-го теста):
ok 1 - utf8 test 11
not ok 2 - utf8 test ≥1
Wide character in print at Test/Builder.pm line 1698.
Wide character in print at Test/Builder.pm line 1698.
Wide character in print at Test/Builder.pm line 1698.
# Compared $data->[0]
# got : '≥'
# expect : '1'
Wide character in subroutine entry at ...
# Tests were run but no plan was declared and done_testing() was not seen.
Я также попробовал обходной путь, который работает для сравнения.
use utf8;
cmp_deeply(["≥"], JSON->new->utf8(0)->decode('["≥"]'), 'utf8 test ≥≥');
... но я все еще получаю глупое предупреждение:
ok 1 - utf8 test ≥≥
Wide character in print at Test/Builder.pm line 1698.
Есть ли способ просто заставить его работать - что-то вроде use magical_unicode_solution;
?
Или, возможно, мне следует проводить тесты по-другому, чтобы сделать его совместимым с Unicode?