Python中的__str__中的Unicode字符
我想用花色的Unicode字符和它们的数值来打印扑克牌。我尝试了以下方法:
def __str__(self):
return u'\u2660'.encode('utf-8')
就像在另一个讨论中建议的那样,但我总是遇到错误,提示UnicodeEncodeError: ascii, ♠, 0, 1, ordinal not in range(128)
。我该怎么做才能在打印一组牌时显示这些花色字符呢?
3 个回答
0
我运行了相同的代码,得到了以下结果:
>>> u'\u2660'.encode('utf-8')
'\xe2\x99\xa0'
>>> print ('\xe2\x99\xa0')
â™
2
根据你是如何把这些“花色符号”编码成字节串的,你需要用合适的编码方式把它转换回Unicode字符串(比如,如果你是用latin-1编码的,就要用thebytestr.decode('latin-1')
!),然后再把这个Unicode字符串转换成utf-8
编码。直接用unicode(something)
会使用默认编码,而默认编码是ASCII,这样就完全无法识别任何“花色符号”了!-)
就像我三个月前说的,我建议用__unicode__
而不是__str__
,不过这只是个简单性的小问题。关键是,如果你的字节串里包含了ASCII编码以外的内容,你必须知道你的字节串使用了什么编码,然后要明确地用那个编码把它解码成Unicode!
3
这个 UnicodeEncodeError
错误到底是在哪里发生的呢?我想到可能有两个问题:
这个
UnicodeEncodeError
错误发生在你的__unicode__
方法里。你的
__unicode__
方法返回的是字节字符串,而不是 Unicode 对象,并且这个字节字符串里包含了非 ASCII 字符。
你的类里有 __unicode__
方法吗?
我根据你评论里的实际数据在 Python 控制台上试了一下:
>>> u'\u2660'.encode('utf-8')
'\xe2\x99\xa0'
>>> print '\xe2\x99\xa0'
♠
看起来是可以正常工作的。你能在你的控制台上试着打印一下吗?也许是你的控制台编码出了问题。