使用Python suds时,Web服务响应中的Unicode错误
我看到过其他关于这个问题的讨论,但没有找到能帮到我的答案。
我的问题和之前一个帖子里提到的“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字符,而不需要做什么特别的处理。