<p><code>print</code>函数是罪魁祸首—它在执行时将字符<code>\x00</code>和<code>\x07</code>转换为ASCII值。具体来说,这只在将字符串传递给<code>print</code>函数时发生,而不是传递给iterable或其他对象(如<code>tuple</code>)。你知道吗</p>
<p>这是一个例子:</p>
<pre><code>>>> s = 'This\x00string\x00is\x00an\x00\x07Example.'
>>> s
'This\x00string\x00is\x00an\x00\x07Example.'
>>> print(s)
This string is an Example.
</code></pre>
<p>如果要将字符串<code>s</code>添加到iterable(<code>tuple</code>、<code>set</code>或<code>list</code>)中,<code>s</code>将不会由<code>print</code>函数格式化:</p>
<pre><code>>>> s_list = [s]
>>> print(s_list) # List
['This\x00string\x00is\x00an\x00\x07Example.']
>>> print(set(s_list)) # Set
{'This\x00string\x00is\x00an\x00\x07Example.'}
>>> print(tuple(s_list)) # Tuple
('This\x00string\x00is\x00an\x00\x07Example.')
</code></pre>
<h2>编辑</h2>
<p>因为<code>\x00</code>和<code>\x07</code>字节是ASCII控制字符,(<code>\x00</code>是NUL,<code>\x07</code>是BEL),所以不能用任何其他方式表示它们。因此,在不打印的情况下从字符串中删除这些字符的唯一方法之一是使用<code>.replace()</code>方法;但是如果终端将<code>\x00</code>字节视为空格,则必须使用<code>s.replace('\x00', ' ')</code>来获得相同的输出,这现在改变了字符串的真实内容。你知道吗</p>
<p>否则,在构建字符串时,您可以尝试实现一些逻辑来检查ASCII控制字符,或者不将它们添加到<code>tempMess</code>,或者添加不同的字符,如空格或类似字符。你知道吗</p>
<h2>参考文献</h2>
<p>ASCII维基:<a href="https://en.wikipedia.org/wiki/ASCII" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/ASCII</a></p>
<p>Curses模块:<a href="https://docs.python.org/3.7/library/curses.ascii.html?highlight=ascii#module-curses.ascii" rel="nofollow noreferrer">https://docs.python.org/3.7/library/curses.ascii.html?highlight=ascii#module-curses.ascii</a>(如果您希望实现任何逻辑,可能会很有用)。你知道吗</p>