7

我正在尝试在 Commission Junction (CJ) 使用 HORRIBLE Web 服务。我可以让客户端连接并从 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 Any Service”之类的记录,然后 ® 导致它打破,我得到了

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

有没有办法在我的一端对 ® 进行编码,以便在 SUDS 读取结果时它不会中断?

更新:澄清一下,® 来自 CJ 数据库并在他们的回复中。所以不知何故,我需要在 SUDS 处理响应之前解码非 ascii 字符。我不确定如何(或是否)在 SUD 中完成此操作。

4

3 回答 3

3

尝试添加 str 和 unicode 对象时会得到隐式 UnicodeDecodeErrors。然后 Python 将尝试将 str 解码为 un​​icode,但使用 ASCII 编码。如果您的 str 然后包含任何不是 ascii 的内容,您将收到此错误。

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

thestring = thestring.decode('utf8')

尽可能多地尝试解码任何可能包含非 ascii 字符的字符串,只要您从任何模块中获得它,在这种情况下是 suds。

然后,如果 suds 不能处理 Unicode(可能是这种情况),请确保在将文本交还给 suds(或任何其他如果你给它 unicode 时会中断的库)之前对其进行编码。

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

于 2011-01-16T08:31:34.327 回答
1

“注册”字符是 U+00AE,编码为"\xc2\xae"UTF-8。看起来您有一个以 UTF-8 编码的 str 对象,但某些代码正在执行(可能是默认情况下)your_str_object.decode("ascii"),这将失败并显示您显示的错误消息。

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

于 2011-01-16T04:09:14.640 回答
0

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

于 2011-01-20T19:08:12.160 回答