<p>现在编码是一个我的领域,我可能在这一个-请纠正我,如果是这样的情况。在</p>
<p>从我多年来收集到的信息来看,Python2假设使用ASCII,除非您在脚本的顶部定义了一个编码。主要是因为它是这样编译的,或者操作系统/终端使用ASCII作为它的主要编码。在</p>
<p>话虽如此,你在示例数据中看到的是:</p>
<pre><code>{ u'Samstag & Sonntag': u'Ganztags ge\xf6ffnet', u'Freitag': u'18:00 & 22:00'}
</code></pre>
<p>是unicode字符串的ASCII表示形式。一些Python如何告诉您其中有一个<code>ö</code>,但是不能使用ASCII,因为<code>ö</code>在<a href="http://www.asciitable.com/" rel="nofollow noreferrer">ASCII table</a>中没有表示。<br/></p>
<p>但当您尝试使用以下方法替换它时:</p>
^{pr2}$
<p>您试图找到一个名为<code>\xf6</code>的ASCII字符/字符串,它超出了ASCII的可接受字节范围,因此将引发异常。你试图用另一个无效的ASCII字符替换它,这将导致同样的异常。在</p>
<p>因此,您得到了“'ascii'codec can't decode byte…”消息。在</p>
<p>您可以这样做unicode替换:</p>
<pre><code>a = u'Ganztags ge\xf6ffnet'
a.replace(u'\xf6', u'ö')
</code></pre>
<p>这将告诉Python找到一个unicode字符串,并用另一个unicode字符串替换它。<br/>
但是在上面的示例中,输出数据将导致相同的结果,因为<code>\xf6</code>在unicode中是<code>ö</code>。在</p>
<p>您要做的是将字符串编码为您想要使用的内容,例如-UTF-8:</p>
<pre><code>a.encode('UTF-8')
'Ganztags ge\xc3\xb6ffnet'
</code></pre>
<p>并将UTF-8定义为您的主要编码,方法是将其放在代码的顶部:</p>
<pre><code>#!/usr/bin/python
# -*- coding: UTF-8
</code></pre>
<p>从理论上讲,这将使您的应用程序更易于使用。<br/>
从那时起,你可以用UTF-8作为你的基本模型。在</p>
<p>但据我所知,无法将你的表示转换成ASCII <code>ö</code>,因为真的没有这种东西。Python会用不同的方式为您实现这种编码魔术,让您相信“只写”是可能的。在</p>
<p><strong>在Python3中,</strong>您遇到的大多数字符串要么是<code>bytes</code>数据,要么与Python2有点不同。在大多数情况下,这要容易得多。在</p>
<p>有一个<a href="https://stackoverflow.com/questions/2276200/changing-default-encoding-of-python">numerous ways to change the encoding</a>不是标准实践的一部分。但有办法做到这一点。<br/>
最接近“良好”实践的是<a href="https://docs.python.org/3.2/library/locale.html" rel="nofollow noreferrer">locale</a>:</p>
<pre><code>locale.setlocale(locale.LC_ALL, 'sv_SE.UTF-8')
</code></pre>
<p>我也有一个可怕的解决方案和方法,这几年前,它看起来像这样(这是一个伟大的预兆,我当时):</p>
<ul>
<li><a href="https://stackoverflow.com/questions/7315629/python-encoding-string-swedish-letters">Python - Encoding string - Swedish Letters</a></li>
</ul>
<h2>日间;夜间:</h2>
<p>您的代码通常假设/使用ASCII作为编码器/解码器。<br/>
<code>ö</code>不是ASCII的一部分,如果您了解如何获得unicode字符,那么您将始终看到{<cd3>}。通常,如果您打印<code>u'Ganztags ge\xf6ffnet'</code>,由于自动编码,它将显示为∗,如果您需要验证输入是否与该字符串匹配,则必须将它们进行比较<code>u'ö' == u'ö'</code>,如果其他系统依赖于此数据,则使用他们理解的内容对其进行编码<code>.encode('UTF-8')</code>。但是将<code>\xf6</code>替换为<code>ö</code>是同一回事,只是<code>ö</code>在ASCII中不存在,您需要做<code>u'ö'</code>-这将导致最后相同的数据。在</p>