2017-08-05 4 views
1

PerlでUnicode文字のPythonのようなデータ構造を出力する必要があり、エンコーディングに問題があります。Perlでは、文字列をPython 2で受け入れられる形式にエンコードする方法はありますか?

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モジュールはありませんか? Python 設定ファイルをPerlで書くには、これが必要です。

答えて

4

以下@PM2Ringの役に立つコメントに基づいて:Pythonの2で

、これらの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..3 
+3

OPはPython 2を使用しています(FWIW、Unicodeの処理はPython 3の方がはるかに優れています)。 Python 2では、これらのUnicode 'u'''文字列には0x80から0xffまでのコードポイントのための' \ x'エスケープシーケンスが必要です。 (Latin-1はUnicodeのサブセットです。すなわち、Unicodeのコードポイント<256はLatin-1の文字と同じです)0x0100から0xffffまでのコードポイントに対して4桁の '\ u'エスケープを使用します、より高いコードポイントの場合は8桁の '\ U'エスケープが必要です。申し訳ありませんが、私はperlを知らないので、さらなる提案はできません。 –

+1

@ PM2Ringご清聴ありがとうございます。 –

-1

Encodeを使用していません。 Pythonのエンコーディングとは異なり、PerlのEncodeモジュールは、ISO-8859-1やUTF-8のような "実際の"文字エンコーディング間でしか変換しません。 Cスタイルの文字エスケープのような他のフォーマットへの変換は実行されません。

関連する問題