什么是e6 b5 8b e8 af 95的编码

时间:2017-08-21 14:29:06

标签: perl unicode encoding

我有一个包含字节序列e6 b5 8b e8 af 95的文本数据源。在这种情况下,我认为它应该是汉字“测试”。

我的perl源代码应该拾取这个字节序列(遗憾的是,这不是UTF-8,我不能将其编码为UTF-8并解码回来),但在某些情况下,序列变为c3 a6 c2 b5 c2 8b c3 a8 c2 af c2 95

尝试找出添加c3c2的可能原因。这是similar question中提到的双重转换问题吗?

1 个答案:

答案 0 :(得分:7)

06d4b 08bd5测试的Unicode代码点。

b5 8b e8 af 95测试的UTF-8编码。

c3 a6 c2 b5 c2 8b c3 a8 c2 af c2 95测试的UTF-8编码的UTF-8编码。

$ perl -e'
    use strict;
    use warnings;
    use utf8;
    use open ":std", ":encoding(UTF-8)";

    my $s = "测试";
    print "$s\n";
    printf "%v05X\n", $s;

    utf8::encode($s);
    printf "%v02X\n", $s;

    utf8::encode($s);
    printf "%v02X\n", $s;
'
测试
06D4B.08BD5
E6.B5.8B.E8.AF.95
C3.A6.C2.B5.C2.8B.C3.A8.C2.AF.C2.95
$ perl -MJSON -e'
    use strict;
    use warnings;
    use utf8;
    use open ":std", ":encoding(UTF-8)";

    my $s = "测试";
    printf "%1\$s (%1\$v05X)\n", $s;
    my $data = [ $s ];
    my $json_utf8 = JSON->new->utf8->encode($data);
    printf "%v02X\n", $json_utf8;
    $data = JSON->new->utf8->decode($json_utf8);
    $s = $data->[0];
    printf "%1\$s (%1\$v05X)\n", $s;
'
测试 (06D4B.08BD5)
5B.22.E6.B5.8B.E8.AF.95.22.5D
测试 (06D4B.08BD5)