Python中的__str__中的Unicode字符

0 投票
3 回答
2627 浏览
提问于 2025-04-15 16:16

我想用花色的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'
♠

看起来是可以正常工作的。你能在你的控制台上试着打印一下吗?也许是你的控制台编码出了问题。

撰写回答