2014-03-12 31 views
4

Inline::Python ::对象重载'""'(字符串化)与此:字符串化内联::的Python:对象编码的Unicode字符串

sub __inline_str__ { 
    my ($self) = @_; 
    return Inline::Python::py_has_attr($self, '__str__') ? $self->__str__() : $self; 
} 

__str__()方法试图转换到ASCII,这意味着如果一个Inline::Python::Object对象代表一个Python Unicode字符串,可能的结果是:

,这似乎是工作

exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 6: ordinal not in range(128) at line 1252

一个解决办法,与$self->encode('utf8')更换$self->__str__()。我不太喜欢像这样修改模块,并且对它进行子类化似乎是一个相当大的挑战。而且,我不能100%确定我的修复程序为什么能够正常工作,这有点令人担忧。

我很确定我不是第一个需要在Perl中使用Python Unicode字符串的人。这应该怎么做?

+2

**正常**的行为将为您的Python代码显式编码;不要使用'str(unicodevalue)',其中可以使用unicodevalue.encode('utf8')'。 –

+0

这将是有道理的,但不幸的是,“我的”Python代码并非真的是我的,我正在使用Inline :: Python将HTTP4Store Python库加载到Perl中。不得不修改一个Python库会像修改'Inline :: Python'一样恼人,因为我不擅长Python,所以风险更大。 :-( – scozy

+0

我承认不知道Perl会为*调用'__inline_str__'子*;如果Python源代码被解码为Unicode,然后解析,那么这就是错误的地方,因为Python中的字节字符串文字保存原始的未编码字节(所以值为0-255)。你知道Perl首先用于解码源代码的编解码器吗? –

回答

-1

One workaround that seems to be working, is replacing $self->str() with $self->encode('utf8').

这是处理这个问题的正确方法。该代码将编码任何UTF字符是这样的:

>>> u'\ufdef'.__str__() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufdef' in position 0: ordinal not in range(128) 
>>> u'\ufdef'.encode('utf-8') 
'\xef\xb7\xaf' 

然后,您将可能需要使用UTF-8解码器在你的PERL正确显示值。

+1

注意:'1 .__ str __()'工作,但'1 .encode('utf-8')'失败 – jfs

+0

如果你能证明'py_has_attr($ self,'__str __')'将永远不会为没有“编码”方法的对象返回真实值。即使在这种情况下,它并没有真正回答我关于如何使用Inline :: Python的问题,而不是如何改变它。 – scozy