【问题标题】:Add a non escaped escape character to python bytearray将非转义转义字符添加到 python bytearray
【发布时间】:2019-09-03 01:32:56
【问题描述】:

我有一个 API 要求对我的 XML 属性中的引号进行转义,因此 不起作用,它需要

我尝试过遍历我的字符串,例如:

b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<tx><cmd id="1">SetChLevel</cmd><name>C</name><value>30</value></tx>'

每次遇到 " (ascii 34) 时,我都会用转义字符 (ascii 92) 和另一个引号替换它。令人发指的是:

b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<tx><cmd id=\\"1\\">SetChLevel</cmd><name>C</name><value>30</value></tx>'

逃脱的地方。作为健全性检查,我将 92 替换为任何其他字符,它按预期工作。

temp = b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<tx><cmd id="1">\
SetChLevel</cmd><name>C</name><value>30</value></tx>'

i = 0
j = 0
payload = bytearray(len(temp) + 4)

for char in temp:
    if char == 34:
        payload[i] = 92
        i += 1
        payload[i] = 34
        i += 1
        j += 1
    else:
        payload[i] = temp[j]
        i += 1
        j += 1

print(bytes(payload))

我会假设字符 92 会出现一次,但有些东西正在逃脱!

【问题讨论】:

  • 我做了一个测试,似乎 bytes() 正在添加转义。
  • 明确一点,bytes() 没有添加任何内容,但是打印到屏幕上的内容添加了内容,因为打印它的功能添加了内容。

标签: python utf-8 ascii


【解决方案1】:

您的问题是对 Python 新手的一个非常常见的误解的结果。

当将字符串(或字节)打印到控制台时,Python 会转义转义字符 (\) 以显示一个字符串,当在 Python 中用作文字时,该字符串会为您提供完全相同的值。

所以:

s = 'abc\\abc'
print(s)

打印abc\abc,但在解释器上你得到:

>>> s = 'abc\\abc'
>>> print(s)
abc\abc
>>> s
'abc\\abc'

请注意,这是正确的。毕竟print(s) 应该在控制台上按原样显示字符串,而解释器上的s 要求Python 向您显示s 的表示,其中包括引号和转义字符。

比较:

>>> repr(s)
"'abc\\\\abc'"

repr 在这里打印s 的表示形式。

对于bytes,事情变得更加复杂,因为使用print时会打印表示,因为打印会打印一个字符串并且需要先解码bytes,即:

>>> print(some_bytes.decode('utf-8'))  # or whatever the encoding is

简而言之:您的代码正在按照您的意愿行事,它不会重复转义字符,您只是认为它这样做是因为您查看的是字节的表示,而不是实际的字节内容。

顺便说一句,这也意味着您不必偏执地编写自定义代码来根据字符的 ASCII 值替换字符,您可以简单地:

>>> example = bytes('<some attr="value">test</some>', encoding='utf-8')
>>> result = example.replace(b'"', b"\\\"")
>>> print(result.decode('utf-8'))
<some attr=\"value\">test</some>

我不会假装 b"\\\"" 很直观,也许 b'\\"' 更好 - 但两者都要求您了解字符串表示形式与其打印值之间的区别。

所以,最后:

>>> example = b'<some attr="value">test</some>'
>>> result = example.replace(b'"', b'\\"')
>>> print(result.decode('utf-8'))
<some attr=\"value\">test</some>

【讨论】:

  • 完美,非常感谢!这似乎是一种模式,Python 比我思考问题的方式领先一步。它已经实施并有效。当然,正如这些事物的本质一样,API 的问题在于 XML Elementree 没有在 XML 声明之后放置换行符。这些时间我再也回不来了,但至少我学到了更多关于 Python 字符串的知识。
  • 通常只有在我用 Python 编写代码之后,我才发现已经有一些东西在做完全相同的事情,无论是在库中还是在外部包中。问题是,在你尝试动手做之前,你通常不知道要问什么——边做边学不会浪费你的时间,即使你最终没有使用自己的代码,只是一点点很难向老板和客户解释 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2020-08-27
  • 2011-09-09
相关资源
最近更新 更多