Skip to main content
 首页 » 编程设计

Python 统一码错误

2025年05月04日17zlslch

有人能解释一下为什么在下面的例子中,打印一个 引发异常,而 a.__str__() 不会?

>>> class A: 
...   def __init__(self): 
...     self.t1 = "čakovec".decode("utf-8") 
...     self.t2 = "tg" 
...   def __str__(self): 
...     return self.t1 + self.t2 
...  
>>> a = A() 
>>> print a 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u010d' in position 0: ordinal not in range(128) 
>>> a.__str__() 
u'\u010dakovectg' 
>>> print a.__str__() 
čakovectg 

请您参考如下方法:

在 Python 2 中,str 必须返回一个 ASCII 字符串。当您直接调用 __str__ 时,您将跳过 Python 将 __str__ 的输出转换为 ASCII 字符串的步骤(实际上您可以从 __str__ 返回任何您想要的内容) ,但你不应该)。 __str__ 不应该返回一个 unicode 对象,它应该返回一个 str 对象。

您可以改为执行以下操作:

In [29]: class A(object): 
    ...:     def __init__(self): 
    ...:         self.t1 = u"c∃".encode('utf8') 
    ...:     def __str__(self): 
    ...:         return self.t1 
    ...:      
 
In [30]: a = A() 
 
In [31]: print a 
c∃ 
 
In [32]: str(a) 
Out[32]: 'c\xe2\x88\x83' 
 
In [33]: a.__str__() 
Out[33]: 'c\xe2\x88\x83'