<p>Python试图通过将文本片段(作为字节存储在数据库中)转换为Python<code>str</code>对象来提供帮助。为了进行这种转换,python必须猜测查询返回的每个字节(或字节组)代表的字母。默认猜测是一种称为utf-8的编码。显然,你的猜测是错的。</p>
<p>解决方案是给python一点提示,告诉他如何从字节到字母(即unicode字符)进行映射。你已经接近底线了</p>
<pre><code>conn.text_factory = str
</code></pre>
<p>但是(基于您在上面注释中的响应),由于您使用的是python 3,<code>str</code>是默认的</em>文本工厂,因此这一行对您没有任何新功能(请参见<a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.text_factory" rel="noreferrer">the docs</a>)。</p>
<p>这一行的幕后操作是,python尝试使用<code>str</code>函数转换查询返回的字节,类似于:</p>
<pre><code>your_string = str(the_bytes, 'utf-8') # actually uses `conn.text_factory`, not `str`
</code></pre>
<p>…但你需要一个不同的编码,其中'utf-8'是。由于无法更改<code>str</code>函数的默认编码,因此必须以其他方式模拟它。您可以使用一个名为a<em>lambda</em>的一次性无名函数来实现以下目的:</p>
<pre><code>conn.text_factory = lambda x: str(x, 'latin1')
</code></pre>
<p>现在,当数据库将字节传递给python时,python将尝试使用“latin1”方案而不是“utf-8”方案将它们映射到字母。当然,我不知道latin1是否是您数据的正确编码。实际上,你必须尝试一些编码才能找到正确的编码。我将首先尝试以下操作:</p>
<ul>
<li><code>'iso-8859-1'</code></li>
<li><code>'utf-16'</code></li>
<li><code>'utf-32'</code></li>
<li><code>'latin1'</code></li>
</ul>
<p>您可以找到一个更完整的列表<a href="https://docs.python.org/3/library/codecs.html#standard-encodings" rel="noreferrer">here</a>。</p>
<p>另一种选择是简单地让从数据库中输出的字节保持为字节。这对你来说是否是个好主意取决于你的申请。您可以通过设置:</p>
<pre><code>conn.text_factory = bytes
</code></pre>