我有一本字典是这样的:
{ u'Samstag & Sonntag': u'Ganztags ge\xf6ffnet', u'Freitag': u'18:00 & 22:00'}
现在我尝试用\xf6
替换ö
,
但是尝试.replace('\xf6', 'ö')
会返回一个错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position
0: ordinal not in range(128)
我该怎么解决这个问题?在
Tags:
由于您使用的是德语,您应该知道非ascii字符。您知道您的系统更喜欢Latin1(Windows控制台和一些Unix)、UTF8(大多数Linux变体)还是原生unicode(Windows GUI)。在
如果您可以像本机unicode那样处理所有的东西,那么事情就会变得更干净,并且您应该接受这样一个事实,即}是同一个字符-后者与python源文件字符集无关。在
u'ö'
和{如果必须输出字节字符串并将其存储在文件中,则应将其编码为UTF8(可以处理任何unicode字符,但127以上的代码字符使用超过1个字节)或Latin1(每个字符一个字节,但仅支持256以下的unicode码位)
在这种情况下,只需使用显式编码将unicode字符串转换为字节字符串:
应该给你所期望的。在
现在编码是一个我的领域,我可能在这一个-请纠正我,如果是这样的情况。在
从我多年来收集到的信息来看,Python2假设使用ASCII,除非您在脚本的顶部定义了一个编码。主要是因为它是这样编译的,或者操作系统/终端使用ASCII作为它的主要编码。在
话虽如此,你在示例数据中看到的是:
是unicode字符串的ASCII表示形式。一些Python如何告诉您其中有一个
ö
,但是不能使用ASCII,因为ö
在ASCII table中没有表示。但当您尝试使用以下方法替换它时:
^{pr2}$您试图找到一个名为
\xf6
的ASCII字符/字符串,它超出了ASCII的可接受字节范围,因此将引发异常。你试图用另一个无效的ASCII字符替换它,这将导致同样的异常。在因此,您得到了“'ascii'codec can't decode byte…”消息。在
您可以这样做unicode替换:
这将告诉Python找到一个unicode字符串,并用另一个unicode字符串替换它。
但是在上面的示例中,输出数据将导致相同的结果,因为
\xf6
在unicode中是ö
。在您要做的是将字符串编码为您想要使用的内容,例如-UTF-8:
并将UTF-8定义为您的主要编码,方法是将其放在代码的顶部:
从理论上讲,这将使您的应用程序更易于使用。
从那时起,你可以用UTF-8作为你的基本模型。在
但据我所知,无法将你的表示转换成ASCII
ö
,因为真的没有这种东西。Python会用不同的方式为您实现这种编码魔术,让您相信“只写”是可能的。在在Python3中,您遇到的大多数字符串要么是
bytes
数据,要么与Python2有点不同。在大多数情况下,这要容易得多。在有一个numerous ways to change the encoding不是标准实践的一部分。但有办法做到这一点。
最接近“良好”实践的是locale:
我也有一个可怕的解决方案和方法,这几年前,它看起来像这样(这是一个伟大的预兆,我当时):
日间;夜间:
您的代码通常假设/使用ASCII作为编码器/解码器。
}。通常,如果您打印
ö
不是ASCII的一部分,如果您了解如何获得unicode字符,那么您将始终看到{u'Ganztags ge\xf6ffnet'
,由于自动编码,它将显示为∗,如果您需要验证输入是否与该字符串匹配,则必须将它们进行比较u'ö' == u'ö'
,如果其他系统依赖于此数据,则使用他们理解的内容对其进行编码.encode('UTF-8')
。但是将\xf6
替换为ö
是同一回事,只是ö
在ASCII中不存在,您需要做u'ö'
-这将导致最后相同的数据。在相关问题 更多 >
编程相关推荐