【问题标题】:How to fix unicode issue when using a web service with Python Suds使用带有 Python Suds 的 Web 服务时如何解决 unicode 问题
【发布时间】:2011-06-09 20:48:12
【问题描述】:

我正在尝试在 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 中完成此操作。

【问题讨论】:

  • 确保不要混合使用 strunicode 对象,例如 u'a'+'®' 会导致错误。尽早将输入解码为 Unicode。

标签: python soap wsdl suds


【解决方案1】:

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

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

【讨论】:

  • 要清楚。导致错误的数据在来自 Web 服务的回复中。因此,我发送了一个有效的请求,但是当 CJ 在响应中使用“注册”字符回复时,就会出现问题。所以我需要做的是在 SUDS 尝试解析之前以某种方式清理字符。就代码而言,您在上面看到的就是使用 SUDS 获得 Web 服务响应和 SUD 错误所需的全部内容。
  • @chris:所有需要做的是每个人在询问引发异常的问题时应该做的事情:运行导致问题所需的最少代码,并且将完整的错误消息和回溯复制/粘贴到您的问题的编辑中。顺便问一下,你怎么知道它是响应中的“注册”字符?
  • John - 我运行的代码是我在问题中提出的,错误是“UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 759: ordinal not in range(128) ”。不知道你在要求什么。我知道它是“注册”字符,因为我可以使用另一个不会破坏 ascii 字符的肥皂客户端,并看到破坏“注册”字符的结果包含在响应中。当结果不包括“注册”字符时,结果返回正确。问题最终出现在 SUD 中,我做了一个 ghetto 补丁。谢谢
【解决方案2】:

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

您的解决方案是像这样手动解码:

thestring = thestring.decode('utf8')

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

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

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

【讨论】:

  • 伦纳特。问题是非 ascii 字符实际上在 CJ 数据库和它们发送的响应中。所以不确定在 SUDS 尝试解析它并抛出错误之前我如何解码他们的响应。我需要以某种方式发送请求,解码响应,然后解析响应。但我看不到在 SUD 中执行此操作的方法。
  • @chris:所以错误发生在 suds 中,甚至在您的代码处理数据之前?在这种情况下,它是一个错误,无论是在 suds 中还是在服务器中。当服务器声称它是其他东西时,也许它会发送以 UTF 编码的数据?
  • Lennart - 正确。我很确定它发生在服务器上(我无法控制)。 Commission Junction 似乎不支持 Web 服务,我希望有办法在数据反馈到 SUD 之前更正数据。我认为这是一个远射,但我想我可能错过了一些东西。
  • @chris:考虑一下,因为它在失败时使用 ascii 解码器,我认为它更有可能是一个 suds 错误。您必须查看 suds 邮件列表。
  • @chris:请报告错误并在fedorahosted.org/suds提交您的补丁
【解决方案3】:

我正在使用 SUDS 通过他们的 SOAP API 与 Salesforce 进行交互。我遇到了同样的情况,直到我遵循@J.F.Sabastian 的建议,不混合 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 下,将“Text File Encoding”设置为 UTF-8,在我的 Mac 上,默认为“MacRoman” .我想在 Windoze 上,默认值是 Cp1252 或 ISO-8859-1(拉丁文)。您也可以在项目的工作区中设置此设置,从他们的工作区继承此设置。这只会影响程序源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多