我正在尝试使用套装unicode字符及其值来打印卡片。我试着做以下事情:
def __str__(self):
return u'\u2660'.encode('utf-8')
与另一个thread中的建议相似,但我一直收到错误UnicodeEncodeError: ascii, ♠, 0, 1, ordinal not in range(128)
。当我打印一张卡片列表时,我该怎么做才能让这些套装角色出现?
答案 0 :(得分:3)
UnicodeEncodeError
究竟出现在哪里?我可以在这里考虑两个可能的问题:
您UnicodeEncodeError
方法中出现__unicode__
。
您的__unicode__
方法返回一个字节字符串而不是一个unicode对象,该字节字符串包含非ASCII字符。
你班上有__unicode__
方法吗?
我根据您评论中的实际数据在Python控制台上尝试了这个:
>>> u'\u2660'.encode('utf-8')
'\xe2\x99\xa0'
>>> print '\xe2\x99\xa0'
♠
似乎有效。你可以尝试在控制台上打印相同的内容吗?也许你的控制台编码就是问题。
答案 1 :(得分:2)
根据您将这些“套装符号”编码为字节字符串的方式,您需要通过提及相应的编解码器(例如,如果latin-1为thebytestr.decode('latin-1')
)来为其创建unicode字符串。在对该unicode字符串进行utf-8
编码之前,如何对其进行编码!)只有unicode(something)
使用默认编码,即ASCII,因此完全不知道任何“套装符号”! - )
正如我当时所说(3个月前),我会去实施__unicode__
而不是__str__
,但这只是一个简单的小问题。更重要的是:如果您的字节字符串包含有限ASCII编码之外的任何内容,您必须知道字节字符串使用的编码,并通过显式使用该编解码器将其解码回Unicode!
答案 2 :(得分:0)
我运行了相同的代码并获得了
>>> u'\u2660'.encode('utf-8')
'\xe2\x99\xa0'
>>> print ('\xe2\x99\xa0')
â™