使用Python suds时,Web服务响应中的Unicode错误

1 投票
1 回答
1988 浏览
提问于 2025-04-16 18:51

我看到过其他关于这个问题的讨论,但没有找到能帮到我的答案。

我的问题和之前一个帖子里提到的“CJ的糟糕网络服务”很相似。

我在使用Python 2.5和suds库(版本0.4.1)。我通过一个网络服务请求一些数据库记录。然后我试着打印返回记录中的一些字段。但是,有些记录的标题包含一些字符,这导致了一个错误。错误信息是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u201d' in position 39: ordinal not in range(128)

我的代码是这样的:(sr是服务请求,也就是我从数据库中获取的记录类型)

response = client.service.QuerySRByExample(input_data)
for sr in response:
    print sr.SRNumber, sr.Title

如果我用ord()函数遍历有问题的标题,我可以看到有一些双引号字符,它们的编码值是8220和8221。这些字符就是导致错误的原因(根据错误信息,第一个双引号在标题字符串的第39个位置)。

... 114 111 108 108 101 114 32 65 8221 32 43 32 8220 68 67 78 ...

如果我改用

    print sr.SRNumber, sr.Title.encode('ascii', 'ignore')

就不会出现错误了。它只是去掉了那些有问题的字符(编码值大于127的字符)。

有没有更好的处理方法呢?我觉得应该能把utf-8的双引号转换成ascii的双引号。

这个网络服务说它使用的是utf-8编码。来自网络服务的响应的第一部分是:

 <?xml version="1.0" encoding="UTF-8" ?> 
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

在另一个讨论中,有用户说他在suds的代码中发现了一些东西,并且能够修复它。我不知道这个修复是否已经被加入到suds库里。

任何帮助都将不胜感激。

1 个回答

1

就是打印不出来。如果你的终端支持utf-8(像Mac和大多数新版本的Linux),那么print sr.Title.encode("utf-8")应该可以正常工作。在Windows上,我觉得你可以试试用系统的编码方式(可能是cp1252)来编码,但可能没有必要的字符。

升级到更新版本的Python可能会有帮助。在2.6和2.7版本中,我可以直接打印出unicode字符,而不需要做什么特别的处理。

撰写回答