在Perl中,如何将字符串编码为Python 2可接受的格式?

时间:2017-08-05 18:17:15

标签: perl encoding character-encoding

我需要使用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 配置文件

2 个答案:

答案 0 :(得分:4)

根据以下@PM2Ring的有用评论:

  

在Python 2中,那些Unicode u''字符串需要从\x0x80的代码点的0xff转义序列。对于\u0x0100的代码点,它们使用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风格的字符转义。