如何在使用Python Suds的Web服务时修复unicode问题

时间:2011-01-16 02:57:18

标签: python soap wsdl 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中如何(或是否)这样做。

3 个答案:

答案 0 :(得分:3)

隐式UnicodeDecodeErrors是您在尝试添加str和unicode对象时获得的。然后,Python将尝试将str解码为unicode,但使用ASCII编码。如果你的str包含任何不是ascii的东西,你就会收到这个错误。

您的解决方案是手动解码,如下所示:

thestring = thestring.decode('utf8')

尝试尽可能地解码任何可能包含非ascii字符的字符串作为soo,因为你从任何模块中获取它,在本例中为suds。

然后,如果suds无法处理Unicode(可能就是这种情况),请确保在将文本传回suds之前将其编码回来(或者如果给它unicode,则将其打破)。

这应该很好地解决问题。这可能是一个很大的变化,因为您需要将所有内部处理从str移动到unicode,但这是值得的。 :)

答案 1 :(得分:1)

“已注册”字符为U + 00AE,在UTF-8中编码为"\xc2\xae"。看起来你有一个用UTF-8编码的str对象,但有些代码正在做(可能是默认情况下)your_str_object.decode("ascii"),它会因你显示的错误消息而失败。

您需要做的是向我们展示一个完整的示例(即获取错误所需的所有代码),以及完整的错误消息和回溯,以便至少我们可以猜测问题是在您的代码中还是在导入的代码。

答案 2 :(得分:0)

我正在使用SUDS通过他们的SOAP API与Salesforce进行交互。我遇到了同样的情况,直到我通过不混合str和unicode字符串类型来遵循@ J.F.Sabastian的建议。例如,传递像这样的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 =>属性和在资源下,将“文本文件编码”设置为UTF-8,在我的Mac上,默认为“MacRoman”。我想在Windoze上,默认是Cp1252或ISO-8859-1(拉丁文)。您也可以在项目的工作区中设置此项,从其工作区继承此设置。这只会影响程序源代码。