Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 当我使用JSON::decode_JSON时,在Test::Deep::cmp_Deep中比较unicode字符串失败_Perl_Unicode - Fatal编程技术网

Perl 当我使用JSON::decode_JSON时,在Test::Deep::cmp_Deep中比较unicode字符串失败

Perl 当我使用JSON::decode_JSON时,在Test::Deep::cmp_Deep中比较unicode字符串失败,perl,unicode,Perl,Unicode,在PerlV5.10.1中,我需要将带有unicode字符的本机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::

在PerlV5.10.1中,我需要将带有unicode字符的本机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
我无法解释最后一个案例发生了什么,为什么这两个结构不相等?我试着 这并没有真正提高我对这个问题的理解

以下是输出(由于TAP过于冗长,因此略为编辑):


当我尝试使用
时,使用utf8,甚至更糟(脚本在第二次测试后死亡):

我还尝试了一种解决方案,可以进行比较

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.
有没有一种方法可以让它发挥作用,比如
使用神奇的unicode\u解决方案

或者,我应该以不同的方式进行测试,使其与Unicode兼容?

此测试将通过:

use Encode;
cmp_deeply( [ Encode::decode("utf8","≥") ],
    JSON::decode_json('["≥"]'), 'utf8 test ≥≥');

JSON解码器将输入视为UTF-8编码,并返回解码字符串。您最初的测试(测试4)将UTF-8编码字符串(两个八位字节)与解码字符串(一个宽字符)进行了比较。

谢谢,这也是我后来发现的,但我希望避免手动解码整个嵌套结构。。无论如何,您是否了解为什么第二个测试为同一个arrayref打印出与测试4不同的内容?另外,为什么当宽字符出现在三个测试中时,打印中只有两个关于
宽字符的警告?
ok 1 - utf8 test ≥≥
Wide character in print at Test/Builder.pm line 1698.
use Encode;
cmp_deeply( [ Encode::decode("utf8","≥") ],
    JSON::decode_json('["≥"]'), 'utf8 test ≥≥');