2013-10-29 17 views
2

代碼:django反序列化試圖將輸入編碼爲ascii?

>>> from django.core import serializers 
>>> objects = serializers.deserialize('xml', fixturestr) 
>>> o = next(objects) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/core/serializers/xml_serializer.py", line 156, in next 
    for event, node in self.event_stream: 
    File "/usr/lib/python2.7/xml/dom/pulldom.py", line 232, in next 
    rc = self.getEvent() 
    File "/usr/lib/python2.7/xml/dom/pulldom.py", line 265, in getEvent 
    self.parser.feed(buf) 
    File "/usr/lib/python2.7/xml/sax/expatreader.py", line 210, in feed 
    self._parser.Parse(data, isFinal) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 565: ordinal not in range(128) 

fixturestr是Unicode對象。消除非ASCII字符不是一種選擇。我怎樣才能阻止解串器做到這一點?

+0

你是否在你的文件的頂部有'#encoding = utf8'? –

+1

@GamesBrainiac(1)這是在控制檯(2)控制檯編碼是utf-8(3),這與問題無關,據我所知。 – Marcin

回答

1

嘗試使用smart_str您的unicode對象轉換爲字符串:

from django.utils.encoding import smart_str 
from django.core import serializers 

objects = serializers.deserialize('xml', smart_str(fixturestr)) 
o = next(objects) 
+0

謝謝,這是我發現的,雖然我看不到需要猜測編碼。我確切知道它是什麼。 – Marcin

0

看來,如果通過一個Unicode對象,解串器將地方嘗試將其編碼爲Unicode。爲了避免這種情況,它必須通過一個字節串:

objects = serializers.deserialize('xml', fixturestr.encode('utf8'))