2009-11-23 4 views
0

Я пытаюсь распечатать карты, используя их юникод и их значение. Я пытался делать в следующем:Python unicode character в __str__

def __str__(self): 
    return u'\u2660'.encode('utf-8') 

, как предложено в другом thread, но я продолжаю получать ошибки, говоря UnicodeEncodeError: ascii, ♠, 0, 1, ordinal not in range(128). Что я могу сделать, чтобы показать персонажу костюма, когда я печатаю список карт?

ответ

3

Где именно происходит UnicodeEncodeError? Я могу думать о двух возможных проблемах здесь:

  • UnicodeEncodeError происходит в вас __unicode__ метод.

  • Ваш метод __unicode__ возвращает байтовую строку вместо объекта unicode, а эта строка содержит символы не ASCII.

У вас есть метод __unicode__ в вашем классе?

Я попробовал это на консоли Python в соответствии с фактическими данными из Вашего комментария:

>>> u'\u2660'.encode('utf-8') 
'\xe2\x99\xa0' 
>>> print '\xe2\x99\xa0' 
♠ 

Это похоже на работу. Не могли бы вы попытаться распечатать то же самое на консоли? Возможно, ваша консольная кодировка является проблемой.

+0

Да, это делает, что просто возвращают значение и '\ u2660'. – sharvey

+0

Спасибо за цитирование некоторых фактических данных здесь, это помогает много. Я только что изменил свое решение в соответствии с фактическими данными вашего сообщения. См. Выше. – fviktor

+0

Спасибо за последующее наблюдение. Он работает так, как ожидалось, в консоли. Однако, когда я просто «возвращаю u '\ u2660'.encode (' utf-8 ')« из функции __str__ в моем классе, я все равно получаю ошибку. – sharvey

2

В зависимости от того, как вы закодировали эти «символы костюма» в строку байтов, вам нужно будет вернуть строку unicode для него, указав соответствующий кодек (например, thebytestr.decode('latin-1'), если латинский-1 - это то, как вы закодировали это!), прежде чем сделать кодировку utf-8 этой строки юникода. Просто unicode(something) использует кодировку по умолчанию, которое является ASCII и поэтому совершенно невежественны о любых «костюм символов»! -)

Как я сказал тогда (3 месяца назад), я бы пойти на реализацию __unicode__ вместо __str__, но это лишь незначительная проблема простоты. Основная точка заключается в том, что: если ваша строка байтов включает в себя что-либо за пределами ограниченной кодировки ASCII, вы должны знать, какая кодировка используется в вашей байтовой строке, и декодировать ее обратно в Юникод, явно используя этот кодек!

0

я запускал тот же самый код и получил

>>> u'\u2660'.encode('utf-8') 
 
'\xe2\x99\xa0' 
 
>>> print ('\xe2\x99\xa0') 
 
â™