Результатом cPickle.dumps()
является str
объект, а не unicode
объект. Вам нужно найти шаг в своем коде, где вы декодируете маринованный объект str
, и пропустить этот шаг.
НЕ ПЫТАЙТЕСЬ конвертировать unicode
объект в str
объект. Два несправедливости не дают права. Пример (Python 2.6):
>>> import cPickle
>>> ps = cPickle.dumps([1,2,3], -1)
>>> ps
'\x80\x02]q\x01(K\x01K\x02K\x03e.'
>>> ups = ps.decode('latin1')
>>> str(ups)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
>>>
Вы вполне можете использовать стандартный (и неэффективный) протокол 0, который выдает «читабельный» вывод:
>>> ps = cPickle.dumps([1,2,3])
>>> ps
'(lp1\nI1\naI2\naI3\na.'
>>>
который предположительно является ASCII (но не подтверждено документально), так что кладжа str(gem.value)
может "" "работать" "":
>>> ps == str(unicode(ps))
True
>>>