擅长:python、mysql、java
<p>您可能认为Python3使事情变得更加困难,但正是相反的意图。您遇到了字符集强制问题。在Python2中,有多种原因会与UTF-8和Unicode字符集混淆。现在已经修好了</p>
<p>首先,如果需要发送二进制数据,最好选择ad-hoc类型,即<code>bytes</code>。使用Python3,在字符串前面加一个<code>b</code>就足够了。这将解决您的问题:</p>
<pre><code>buffer = b"ABCD"
buffer += b"\xCA\xFE\xCA\xFE"
s.sendall(buffer)
</code></pre>
<p>当然,<code>bytes</code>对象没有<code>encode</code>方法,因为它已经被编码为二进制。但是它有相反的方法<code>decode</code></p>
<p>当您使用不带前缀的引号创建<code>str</code>对象时,默认情况下,Python3将使用<strong>Unicode</strong>编码(这是由Python2中的<code>unicode</code>类型或<code>u</code>前缀强制执行的)。这意味着您需要使用<code>encode</code>方法来获取二进制数据</p>
<p>相反,直接使用<code>bytes</code>来存储二进制数据,因为不会发生编码操作,它将保持您键入的状态</p>
<p>错误<code>can only concatenate str (not "bytes") to str</code>不言而喻。Python抱怨它不能将<code>str</code>与<code>bytes</code>连接起来,因为前面的数据需要进一步的步骤,即编码,以使<code>+</code>操作有意义</p>