原來,泡沫看到XML作爲類型 '字符串'(不是Unicode)所以這些被編碼的值。
1)FILTER:
badXML = "your bad utf-8 xml here" #(type <str>)
#Turn it into a python unicode string - ignore errors, kick out bad unicode
decoded = badXML.decode('utf-8', errors='ignore') #(type <unicode>)
#turn it back into a string, using utf-8 encoding.
goodXML = decoded.encode('utf-8') #(type <str>)
2)肥皂水:看https://fedorahosted.org/suds/wiki/Documentation#MessagePlugin
from suds.plugin import MessagePlugin
class UnicodeFilter(MessagePlugin):
def received(self, context):
decoded = context.reply.decode('utf-8', errors='ignore')
reencoded = decoded.encode('utf-8')
context.reply = reencoded
和
from suds.client import Client
client = Client(WSDL_url, plugins=[UnicodeFilter()])
希望這可以幫助別人。
注意:感謝John Machin!
請參見:Why is python decode replacing more than the invalid bytes from an encoded string?
的Python issue8271關於errors='ignore'
可以讓你的方式在這裏。如果沒有這種錯誤固定在Python,「忽略」將消耗接下來的幾個字節,以滿足一個無效的UTF-8字節序列的解碼,僅
起始字節和延續字節(一個或多個過程中的長度
)現在被認爲是無效的, 而不是由起始字節
發行指定的字節數是固定的:
的Python 2.6.6 RC1
的Python 2.7.1 RC1(和2.7所有未來版本)
Python 3.1.3 rc1(以及所有未來版本的3.x)
Python 2.5及更低版本將包含此問題。
在上面的例子中,"\xef\xbc</name".decode('utf-8', errors='ignore')
應該
返回"</name"
,但是在'bug'版本的python中它返回"/name"
。
前四位(0xe
)描述一個3字節UTF字符,所以字節0xef
,0xbc
,然後(錯誤地)0x3c
('<'
)被消耗。
0x3c
不是一個有效的繼續字節,它首先創建無效的3字節UTF字符。
固定的Python的版本只刪除了第一個字節,唯一有效的延續字節,留下0x3c
未消費
是的,我剛纔已經回答我的問題。 :P – FlipMcF 2012-01-03 22:18:49
對你有好處。 +1。 – sberry 2012-01-03 23:18:49
自我學習者徽章掙得...(那真是太棒了!)謝謝。 – FlipMcF 2012-01-12 21:33:59