Python XMLRPC with GBK encoding
一句话,简直是噩梦,如果实在是没有什么理由非要用GBK编码不可,我的建议,还是改用utf-8这样更国际化的标准吧。说实在的,Python下面折腾GBK编码的XMLRPC实在是没有什么意思,没有任何乐趣,只有浪费时间。
言归正传,当你没有办法非要使用GBK编码的xmlrpc服务,体会一下恶梦,那我们就开始吧。首先明确一下革命形势:标准的Python xmlrpclib库,就是不支持GBK编码的。换而言之,指望通过给ServerProxy指定encoding参数的做法,是解决不了什么问题的。问题的关键在于,Python XML模块的底层,依赖的expat这个东东,对GBK支持是有问题的(我是想说更本就不支持,不过不能确定,就暂且定义为有问题),所以只要是依赖这个东西的XML模块,都是不能很好的处理GBK编码下的XML数据的。解决问题的大体方向就出来了,一个是绕过expat,干脆不用这个东西,其二就是认命妥协了,把数据转换成utf-8编码再塞给expat吧。前面一个方案,可联想到的就是libxml2-python。我是采用第二种方案了,这里也有两种可参考的做法,一种是自己定义一个Parser,然后覆盖ServerProxy那个getParser,生成支持转码功能的XMLParser给xmlrpc proxy使用。另外一个办法,就是干脆跳过ServerProxy,自己做一个。考虑到我的实际使用情况,不会有太大的数据传输,没有必要做一个支持流接口的XMLParser,所以就干脆自己重新做了一个代替ServerProxy的东西。下面是简单的代码示例。
PYTHON:
importxmlrpclib
importhttplib
defXMLRPCCall0(URI, methodname, param):
body = xmlrpclib.dumps(
param, methodname, False, 'GBK')
(protocl, host, path,
query, fragment)= httplib.urlsplit(URI)
h = httplib.HTTPConnection(host)
headers = {
'Content-Type': 'text/xml'
}
h.request('POST', URI, body, headers)
res = h.getresponse()
resbody = res.read()
h.close()
resbody = resbody.replace(' encoding="GBK"', '')
returnxmlrpclib.loads(
resbody.decode('GBK').encode('utf-8'))[0][0]
http://www.cnscn.org/htm_data/369/0810/17233.html
言归正传,当你没有办法非要使用GBK编码的xmlrpc服务,体会一下恶梦,那我们就开始吧。首先明确一下革命形势:标准的Python xmlrpclib库,就是不支持GBK编码的。换而言之,指望通过给ServerProxy指定encoding参数的做法,是解决不了什么问题的。问题的关键在于,Python XML模块的底层,依赖的expat这个东东,对GBK支持是有问题的(我是想说更本就不支持,不过不能确定,就暂且定义为有问题),所以只要是依赖这个东西的XML模块,都是不能很好的处理GBK编码下的XML数据的。解决问题的大体方向就出来了,一个是绕过expat,干脆不用这个东西,其二就是认命妥协了,把数据转换成utf-8编码再塞给expat吧。前面一个方案,可联想到的就是libxml2-python。我是采用第二种方案了,这里也有两种可参考的做法,一种是自己定义一个Parser,然后覆盖ServerProxy那个getParser,生成支持转码功能的XMLParser给xmlrpc proxy使用。另外一个办法,就是干脆跳过ServerProxy,自己做一个。考虑到我的实际使用情况,不会有太大的数据传输,没有必要做一个支持流接口的XMLParser,所以就干脆自己重新做了一个代替ServerProxy的东西。下面是简单的代码示例。
PYTHON:
importxmlrpclib
importhttplib
defXMLRPCCall0(URI, methodname, param):
body = xmlrpclib.dumps(
param, methodname, False, 'GBK')
(protocl, host, path,
query, fragment)= httplib.urlsplit(URI)
h = httplib.HTTPConnection(host)
headers = {
'Content-Type': 'text/xml'
}
h.request('POST', URI, body, headers)
res = h.getresponse()
resbody = res.read()
h.close()
resbody = resbody.replace(' encoding="GBK"', '')
returnxmlrpclib.loads(
resbody.decode('GBK').encode('utf-8'))[0][0]
http://www.cnscn.org/htm_data/369/0810/17233.html
标签: Python, SOAP, WebService

