2010-10-21 40 views
0

我有一個帶有文件字段的模型表單。我有一個post_save信號附加到模型上,這樣我就可以通過網絡服務將上傳的文件傳遞給第三方(使用Suds)。當我嘗試傳遞文件內容時,Web服務調用即將消失:它會拋出「UnicodeDecodeError:'ascii'編解碼器無法解碼字節......」(很像在this SO question中)。Django:在保存後立即讀取FileField內容

事情我不明白:當我轉儲文件內容我的信號在通話過程中屏幕上,它看起來像嚴重編碼的垃圾亂:

åÉe Qçú>↑ Åû½ΣΘ⌐v^τ  F,K╪Y<▲î°bαⁿ╡ê5  ╜ù  sö╛Aî▲ƒF|04∙f╛@╙We⌡  ╤â╩_α↑└ƒ∙│ßï(è═|←⌂┌▒■µ'£─♂  ¢V↓ⁿq_;εδ▼εb<í╜ƒÅΩN00τó╛‼¥U╫Z─)?¬∞┐Γ╠C4ä▬Il☼Jº╚J╥Ñ├¿öÆi2═♂ïσNù&▐╤╡╔ΩIêµ╬]└@Üα╒→║¶\⌐UÑ╬çµ∟h⌂¼┘ë¢←↕╚↔ùα▌.¢d╖Y¡,♫½qÆ~╞äLX┬ä[┬2≥¥í=<ß▼]Hⁿ↕!b÷ ñÑU┌M╥╦m¼'½ù'∞"'£└►oêu↓q┘ôÉ>i_÷αµ0♥k§w▒c╠═╬6╙N2▀!)`► 

當我搶同一個對象通過命令行,並呼籲它完全一樣的方法,這一切看起來很好編碼:

\x00F,K\xd8Y<\x1e\x8c\xf8b\xe0\xfc\xb5\x885\xff\x00\xbd\x97\xff\x00s\x07\x94\xbeA\x8c\x1e\x9fF|04\xf9f\[email protected]\xd3We\xf5\xff\x00\xd1\x83\xca_\xe0\x18\xc0\x9f\xf9\xb3\xe1\x8b(\x8a\xcd|\x1b\x7f\xda\xb1\xfe\xe6\'\x9c\xc4\x0b\xff\x00\x9bV\x19\x07\xfcq_;\xee\xeb\x1f\xeeb<\xa1\xbd\x9f\x8f\xeaN00\xe7\xa2\xbe\x13\x9dU\xd7Z\xc4)?\xaa\xec\xbf\xe2\xccC4\x84\x16Il\x0fJ\xa7\xc8J\xd2\xa5\xc3\xa8\x94\x92i2\xcd\x0b\x8b\xe5N\x97&\xde\xd1\xb5\xc9\xeaI\x88\xe6\xce]\[email protected]\x9a\xe0\xd5\x1a\xba\x14\\\xa9U\xa5\xce\x87\xe6\x1ch\x7f\xac\xd9\x89\x9b\x1b\x12\xc8\x1d\x97\xe0\xdd.\x9bd\xb7Y\xad,\x0e\xabq\x92~\xc6\x84LX\xc2\x84[\xc22\xf2\x9d\xa1=<\xe1\x1f]H\xfc\x12!b\xf6\x00\xa4\xa5U\xdaM\xd2\xcbm\xac\'\xab\x97\'\xec"\'\x9c\xc0\x10o\x88u\x19q\xd9\x93\x90>i_\xf6\xe0\xe60\x03k\x15w\xb1c\xcc\xcd\xce6\xd3N2\xdf!)`\x10\nB\x8a\xaes\x13\xad\xd4a\x19\xa7p?\xff\xd9' 

什麼了兩步,我怎樣才能得到正確的回覆內容之間發生了什麼?在我的信號中攫取第二個版本的對象,讓我再次看到糟糕的編碼混亂。 N.B.,這發生在Windows上。

回答

0

一個ASCII編解碼器顯然不能解碼這個,因爲它不是ASCII。我想你必須找出數據的編碼並將一個unicode字符串傳遞給Suds。例如,如果編碼爲UTF-16,則向Suds傳遞unicode(binarydata, 'utf-16')

在第一個示例中,您認爲亂編亂碼的垃圾只是當您讓它顯示二進制數據時屏幕顯示的內容。這裏顯示的字符取決於系統的字符集配置。

你的第二個例子是Python的一些二進制數據的字符串表示。字符串表示只包含可打印的ASCII字符。非打印或非ASCII字符使用十六進制符號顯示。該字符串表示法僅顯示數據的字節,並不會告訴您數據是否在某些字符集中編碼良好。

我無法正確識別你的第二個例子的編碼。我發現的最接近的是'utf-16-le'。但是這仍然會導致代理對的解碼錯誤。

使用s.decode('utf-16-le', 'replace')我有一大堆中國文字:

䘀䬬姘Ḽ뗼㖈ÿ鞽ÿݳ뺔豁鼞籆㐰曹䂾埓ÿ菑忊ᣠ鿀돹詭訨餈縟뇚鰧௄ÿ嚛ܙ燼㭟㱢붡闢儀〰ꋧᎾ喝嫗⧄꨿뿬쳢㑃ᚄ漢䨏좧퉊쎥鎢榒촲謋以⚗퇞즵䧪巎䃀᫕ᒺ꥜ꕕ蟎᳦罨�鮉ማ᷈⻝撛妷ⲭꬎ鉱왾䲄쉘宄㋂鷲㶡崟ﱈℒꐀ喥䷚쯒걭꬧➗⋬鰧Ⴠ衯᥵�鄧椾̰ᕫ녷챣컍팶㉎⇟怩ਐ詂瑋괓懍ꜙ㽰� 

有趣的是,谷歌翻譯的第三個字符,,以http

UPDATE:以下交互式的Python會話可以澄清我的意思是在我下面的評論:

>>> s = '\x00F,K\xd8Y' 
>>> print(s) 
F,K�Y 
>>> u = s.decode('utf-16-le') 
>>> u 
u'\u4600\u4b2c\u59d8' 
>>> print(u) 
䘀䬬姘 
>>> 
+0

我知道,第一是文件的二進制編碼版本。我不明白的是爲什麼當我在保存時訪問文件時得到它,但是當我在命令行打開它時獲取Unicode表示。我猜測它與在Windows上和我的代碼文件上設置的編碼有關。 – Tom 2010-10-23 14:22:18

+0

@Tom:我假設在第一個版本中,您直接將文件的二進制內容打印到屏幕上,而在第二個版本中,您讓Python打印出數據的字符串表示形式(可能在交互式Python shell中?)。第二個版本仍然不是unicode - 字符串表示只顯示字節。 Python對unicode字符串的表示看起來像'u'\ u4600 \ u4b2c \ u59d8''(這是上面的三個中文字符)。 – 2010-10-23 22:49:15

相關問題