我需要用Perl打印一个具有unicode字符的Python数据结构,并在编码上遇到困难。
Python代码:
import pprint
flavour = u'süß' # 'sweet' in German
pprint.pprint(flavour)
# Output:
u's\xfc\xdf'我希望使用Perl生成完全相同的输出。我知道我能做到
use utf8;
my $flavour = 'süß';
$flavour =~ s/ü/\\xfc/g;
$flavour =~ s/ß/\\xdf/g;
print "u'$flavour'\n";
# Output:
u's\xfc\xdf'但是其他奇怪的角色呢?难道没有一个Enconding模块可以做我想做的事吗?我需要它来用Perl编写Python配置文件。
发布于 2017-08-05 18:41:03
以下是@PM2Ring的有益评论:
在Python2中,这些Unicode
u''字符串需要从0x80到0xff的代码点的\x转义序列。从0x0100到0xffff的编码点使用4位\U转义,高码点使用8位\U转义。
use utf8;
use strict;
use warnings;
use open qw(:std :utf8);
use Test::More;
my @cases = (
[ 'süß' => q{u's\\xfc\\xdf'} ],
[ '╔═╗' => q{u'\\u2554\\u2550\\u2557'} ],
[ '' => q{u'\\U00010c1a\\U00010c07\\U00010c1a'} ],
);
for my $case (@cases) {
is string_to_python2_escaped($case->[0]), $case->[1], "$case->[0] maps to $case->[1]";
}
done_testing;
sub string_to_python2_escaped {
sprintf "u'%s'", join '', map char_to_python2_escape($_), split //, $_[0];
}
sub char_to_python2_escape {
my $c = shift;
my $k = ord($c);
return $c if $k <= 0x7f;
return sprintf('\\x%02x', $k) if $k <= 0xff;
return sprintf('\\u%04x', $k) if $k <= 0xffff;
return sprintf('\\U%08x', $k);
}输出:
ok 1 - süß maps to u's\xfc\xdf'
ok 2 - ╔═╗ maps to u'\u2554\u2550\u2557'
ok 3 - maps to u'\U00010c1a\U00010c07\U00010c1a'
1..3https://stackoverflow.com/questions/45525079
复制相似问题