允许使用xmlrpc以字符串形式传输任何ASCII字符

时间:2013-01-12 14:23:04

标签: python encoding xml-rpc

我正在使用xmlrpc将一串字符(任意8位字符)从服务器发送到客户端。事实证明,回车符\r(dec 13十六进制0xd)被抑制。也就是说,当原始字符串由以下三个字符组成时(由它们的十六进制代码表示):

0x3a 0xd 0xa

然后我在客户端收到的只有'两个'字符:

0x3a 0xa

如何配置xmlrpc(在python中),以便能够使用0xd接收完整的原始3个字符的字符串?有没有办法可以在不使用二进制包装器或其他东西的情况下完成?

2 个答案:

答案 0 :(得分:1)

当您将str对象作为XML-RPC中的字符串值传递时,它将被编码并解码为字符串。 (顺便说一下,该字符串应该包含XML中允许的字符,但在您的情况下这并不重要。)它不是二进制块,并且在解析XML时\r\n被转换为\n。恕我直言,没有什么可以做,没有一套选项可以挽救局面。

只需查看dumps()中的loads()xmlrpclib对您的字符串执行的操作:

>>> from xmlrpclib import dumps, loads
>>> s = '\x3a\x0d\x0a'
>>> e = dumps((s,)) # Just a tuple
>>> e
'<params>\n<param>\n<value><string>:\r\n</string></value>\n</param>\n</params>\n'
>>> loads(e)
((':\n',), None)

因此,当执行loads()时,\r\n序列会转换为\n,而\r会丢失。当然,您可以使用转换后的字符串(例如s.encode('hex')看起来相当不错),但据我所知,如果您无法改变服务器行为(对参数执行s.decode('hex')),什么都没有帮助。

答案 1 :(得分:0)

作为python3的更新,请使用xmlrpc.client代替xmlrpclib:

>>> from xmlrpc.client import dumps, loads