首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Perl中,如何将字符串编码成Python 2可以接受的格式?

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

Stack Overflow用户
提问于 2017-08-05 18:17:15
回答 1查看 144关注 0票数 1

我需要用Perl打印一个具有unicode字符的Python数据结构,并在编码上遇到困难。

Python代码:

代码语言:javascript
运行
复制
import pprint
flavour = u'süß'  # 'sweet' in German
pprint.pprint(flavour)

# Output:
u's\xfc\xdf'

我希望使用Perl生成完全相同的输出。我知道我能做到

代码语言:javascript
运行
复制
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配置文件。

EN

Stack Overflow用户

回答已采纳

发布于 2017-08-05 18:41:03

以下是@PM2Ring的有益评论:

在Python2中,这些Unicode u''字符串需要从0x800xff的代码点的\x转义序列。从0x01000xffff的编码点使用4位\U转义,高码点使用8位\U转义。

代码语言:javascript
运行
复制
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);
}

输出:

代码语言:javascript
运行
复制
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
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45525079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档