簡體   English   中英

如何在使用Python Suds的Web服務時修復unicode問題

[英]How to fix unicode issue when using a web service with Python Suds

我正在努力與Commission Junction(CJ)的HORRIBLE網絡服務合作。 我可以讓客戶端連接並從CJ接收信息,但是他們的數據庫似乎包含一堆導致UnicideDecodeError的壞字符。

現在我在做:

from suds.client import Client
wsdlLink = 'https://link-search.api.cj.com/wsdl/version2/linkSearchServiceV2.wsdl'
client = Client(wsdlLink)
result = client.service.searchLinks(developerKey='XXX', websiteId='XXX', promotionType='coupon')

這個工作正常,直到我打出一個類似'CorpNet®10%Off Off Service'之類的記錄,然后®導致它破壞我得到

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 758: ordinal not in range(128)" error.

有沒有辦法在我的頭上對®進行編碼,這樣當SUDS讀入結果時它不會中斷?

更新 :澄清一下,®來自CJ數據庫,並在他們的回復中。 所以我需要在SUDS處理響應之前解碼非ascii字符。 我不確定在SUD中如何(或是否)這樣做。

在嘗試添加str和unicode對象時,會出現隱式UnicodeDecodeErrors。 然后,Python將嘗試將str解碼為unicode,但使用ASCII編碼。 如果你的str包含任何不是ascii的東西,你就會收到這個錯誤。

您的解決方案是手動解碼,如下所示:

thestring = thestring.decode('utf8')

嘗試盡可能地將任何可能包含非ascii字符的字符串解碼為soo,因為您可以從任何模塊中將其傳遞給它,在本例中為suds。

然后,如果suds無法處理Unicode(可能是這種情況),請確保在將文本處理回suds(或任何其他如果給它unicode時中斷的其他庫)之前將其編碼回來。

這應該很好地解決問題。 這可能是一個很大的變化,因為您需要將所有內部處理從str移動到unicode,但這是值得的。 :)

“已注冊”字符為U + 00AE,在UTF-8中編碼為"\\xc2\\xae" 看起來你有一個用UTF-8編碼的str對象,但有些代碼正在做(可能是默認情況下) your_str_object.decode("ascii") ,它會因你顯示的錯誤消息而失敗。

您需要做的是向我們展示一個完整的示例(即獲取錯誤所需的所有代碼),以及完整的錯誤消息和回溯,以便至少我們可以猜測問題是在您的代碼中還是在導入的代碼中。

我正在使用SUDS通過他們的SOAP API與Salesforce進行交互。 我遇到了同樣的情況,直到我通過不混合str和unicode字符串類型來遵循@ JFSabastian的建議。 例如,傳遞這樣的SOQL字符串確實適用於SUDS 0.3.9:

qstr = u"select Id, FirstName, LastName from Contact where FirstName='%s' and LastName='%s'"  % (u'Jorge', u'López')

我似乎也不需要做str.decode(“utf-8”)。

如果您在Eclipse上運行PyDev中的腳本,您可能需要進入Project => Properties並在Resource下,將“Text File Encoding”設置為UTF-8,在我的Mac上,默認為“MacRoman”。 我想在Windoze上,默認是Cp1252或ISO-8859-1(拉丁文)。 您也可以在項目的工作區中設置此項,從其工作區繼承此設置。 這只會影響程序源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM