【问题标题】:Allowing any ASCII character transmitted in string with xmlrpc允许使用 xmlrpc 在字符串中传输任何 ASCII 字符
【发布时间】:2013-01-12 14:23:04
【问题描述】:

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

0x3a 0xd 0xa

然后我在客户端只收到“两个”字符:

0x3a 0xa

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

【问题讨论】:

  • 它们都是取决于操作系统的有效行分隔符,并且可以轻松转换为其中一个,为什么会出现问题?
  • \r 是回车符 R。 \n 是 N换行符。无论如何,您能否展示一个问题和预期输出的最小示例?
  • 你似乎不明白我的问题。在服务器端,序列0x3a 0xd 0xa 应该通过xmlrpc 发送到客户端,我想接收完全相同的序列,即0x3a 0xd 0xa(这些是通过xmlrpc 发送的三个字符的十六进制表示)。

标签: python encoding xml-rpc


【解决方案1】:

当您在 XML-RPC 中将 str 对象作为字符串值传递时,它会被编码和解码为字符串。 (顺便说一句,该字符串应该由 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')),则无济于事。

【讨论】:

  • 感谢您的回答。看来我在服务器端和客户端有一些编码工作要做。
【解决方案2】:

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

>>> from xmlrpc.client import dumps, loads

【讨论】:

  • 有用的更新,虽然这应该是对上一个答案的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2021-01-11
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多