我有一个API要求转义XML属性中的引号,因此<;cmd\u id=“1”>;不起作用,它需要<;cmd\u id=\“1\”>;。你知道吗
我试过遍历我的字符串,例如:
b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<tx><cmd id="1">SetChLevel</cmd><name>C</name><value>30</value></tx>'
每次遇到“(ascii34),我都会用转义字符(ascii92)和另一个引号替换它。令人气愤的是,这导致:
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会出现一次,但是有什么东西正在逃逸!你知道吗
您的问题是对Python新手的一个非常常见的误解造成的。你知道吗
在将字符串(或字节)打印到控制台时,Python将转义字符(
\
)转义,以显示一个字符串,在Python中用作文本时,该字符串将为您提供完全相同的值。你知道吗所以:
打印
abc\abc
,但在解释器上可以得到:请注意,这是正确的。毕竟
print(s)
应该在控制台上按原样显示字符串,而解释器上的s
则要求Python显示s的表示,其中包括引号和转义字符。你知道吗比较:
repr
这里打印s
的表示。你知道吗对于
bytes
,事情变得更加复杂,因为在使用print
时打印表示,因为print打印字符串,而bytes
需要首先解码,即:简而言之:你的代码做了你想做的事情,它没有重复转义字符,你认为它做了,只是因为你看到的是字节的表示,而不是实际的字节内容。你知道吗
顺便说一下,这也意味着您不必偏执,也不必费心编写自定义代码来替换基于ASCII值的字符,您可以简单地:
我不会假装
b"\\\""
是直观的,也许b'\\"'
更好——但两者都要求您理解字符串表示或其打印值之间的区别。你知道吗所以,最后:
相关问题 更多 >
编程相关推荐