向python bytearray添加非转义转义字符

2024-06-16 08:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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会出现一次,但是有什么东西正在逃逸!你知道吗


Tags: nameltgtcmdidvalueversionxml
1条回答
网友
1楼 · 发布于 2024-06-16 08:27:03

您的问题是对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时打印表示,因为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>

相关问题 更多 >