我有一个包含字节序列e6 b5 8b e8 af 95
的文本数据源。在这种情况下,我认为它应该是汉字“测试”。
我的perl源代码应该拾取这个字节序列(遗憾的是,这不是UTF-8,我不能将其编码为UTF-8并解码回来),但在某些情况下,序列变为c3 a6 c2 b5 c2 8b c3 a8 c2 af c2 95
尝试找出添加c3
和c2
的可能原因。这是similar question中提到的双重转换问题吗?
答案 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)