我需要使用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 配置文件。
答案 0 :(得分:4)
根据以下@PM2Ring的有用评论:
在Python 2中,那些Unicode
u''
字符串需要从\x
到0x80
的代码点的0xff
转义序列。对于\u
到0x0100
的代码点,它们使用4位0xffff
转义符,对于更高的代码点,它们使用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..3
答案 1 :(得分:-1)
不使用Encode
。与Python的编码不同,Perl的编码模块仅在&#34; real&#34;之间进行转换。字符编码,如ISO-8859-1和UTF-8。它不会执行其他格式的转换,例如C风格的字符转义。