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字符串的人。这应该怎么做?
**正常**的行为将为您的Python代码显式编码;不要使用'str(unicodevalue)',其中可以使用unicodevalue.encode('utf8')'。 –
这将是有道理的,但不幸的是,“我的”Python代码并非真的是我的,我正在使用Inline :: Python将HTTP4Store Python库加载到Perl中。不得不修改一个Python库会像修改'Inline :: Python'一样恼人,因为我不擅长Python,所以风险更大。 :-( – scozy
我承认不知道Perl会为*调用'__inline_str__'子*;如果Python源代码被解码为Unicode,然后解析,那么这就是错误的地方,因为Python中的字节字符串文字保存原始的未编码字节(所以值为0-255)。你知道Perl首先用于解码源代码的编解码器吗? –