擅长:python、mysql、java
<h2>可能的解决方案</h2>
<p>或者这样写:</p>
<pre><code>a = {"a": u"çö"}
b = "çö"
b.decode('utf-8') == a['a']
</code></pre>
<p>或者像这样(您也可以跳过两边的<code>.decode('utf-8')</code>):</p>
<pre><code>a = {"a": "çö"}
b = "çö"
b.decode('utf-8') == a['a'].decode('utf-8')
</code></pre>
<p>或者像这样(我的建议):</p>
<pre><code>a = {"a": u"çö"}
b = u"çö"
b == a['a']
</code></pre>
<h2>解释</h2>
<p><em>根据蒂姆的评论更新。</em>在原始代码中,<code>b.decode('utf-8') == u'çö'</code>和<code>a['a'] == 'çö'</code>,因此您实际上进行了以下比较:</p>
<pre><code>u'çö' == 'çö'
</code></pre>
<p>其中一个对象是类型<code>unicode</code>,另一个是类型<code>str</code>,因此为了执行比较,将<code>str</code>转换为<code>unicode</code>,然后比较两个<code>unicode</code>对象。它在纯ASCII字符串的情况下工作良好,例如:<code>u'a' == 'a'</code>,因为<code>unicode('a') == u'a'</code>。</p>
<p>但是,在<code>u'çö' == 'çö'</code>的情况下失败,因为<code>unicode('çö')</code>返回以下错误:<em>Unicode decode error:“ascii”编解码器无法解码位置0中的字节0xc3:序号不在范围(128)</em>内,因此整个比较返回False并发出以下警告:<em>Unicode warning:Unicode equal comparison未能同时转换这两个Unicode的参数-将它们解释为不等的</em>。</p>