编码问题。更换专用ch

2024-10-01 19:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典是这样的:

{ 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: in字典错误asciicanreplacecodecge
2条回答

由于您使用的是德语,您应该知道非ascii字符。知道您的系统更喜欢Latin1(Windows控制台和一些Unix)、UTF8(大多数Linux变体)还是原生unicode(Windows GUI)。在

如果您可以像本机unicode那样处理所有的东西,那么事情就会变得更干净,并且您应该接受这样一个事实,即u'ö'和{}是同一个字符-后者与python源文件字符集无关。在

如果必须输出字节字符串并将其存储在文件中,则应将其编码为UTF8(可以处理任何unicode字符,但127以上的代码字符使用超过1个字节)或Latin1(每个字符一个字节,但仅支持256以下的unicode码位)

在这种情况下,只需使用显式编码将unicode字符串转换为字节字符串:

print u'Ganztags ge\xf6ffnet'.encode('Latin1') # or .encode('utf8')

应该给你所期望的。在

现在编码是一个我的领域,我可能在这一个-请纠正我,如果是这样的情况。在

从我多年来收集到的信息来看,Python2假设使用ASCII,除非您在脚本的顶部定义了一个编码。主要是因为它是这样编译的,或者操作系统/终端使用ASCII作为它的主要编码。在

话虽如此,你在示例数据中看到的是:

{ u'Samstag & Sonntag': u'Ganztags ge\xf6ffnet', u'Freitag': u'18:00 & 22:00'}

是unicode字符串的ASCII表示形式。一些Python如何告诉您其中有一个ö,但是不能使用ASCII,因为öASCII table中没有表示。

但当您尝试使用以下方法替换它时:

^{pr2}$

您试图找到一个名为\xf6的ASCII字符/字符串,它超出了ASCII的可接受字节范围,因此将引发异常。你试图用另一个无效的ASCII字符替换它,这将导致同样的异常。在

因此,您得到了“'ascii'codec can't decode byte…”消息。在

您可以这样做unicode替换:

a = u'Ganztags ge\xf6ffnet'
a.replace(u'\xf6', u'ö')

这将告诉Python找到一个unicode字符串,并用另一个unicode字符串替换它。
但是在上面的示例中,输出数据将导致相同的结果,因为\xf6在unicode中是ö。在

您要做的是将字符串编码为您想要使用的内容,例如-UTF-8:

a.encode('UTF-8')
'Ganztags ge\xc3\xb6ffnet'

并将UTF-8定义为您的主要编码,方法是将其放在代码的顶部:

#!/usr/bin/python
# -*- coding: UTF-8

从理论上讲,这将使您的应用程序更易于使用。
从那时起,你可以用UTF-8作为你的基本模型。在

但据我所知,无法将你的表示转换成ASCII ö,因为真的没有这种东西。Python会用不同的方式为您实现这种编码魔术,让您相信“只写”是可能的。在

在Python3中,您遇到的大多数字符串要么是bytes数据,要么与Python2有点不同。在大多数情况下,这要容易得多。在

有一个numerous ways to change the encoding不是标准实践的一部分。但有办法做到这一点。
最接近“良好”实践的是locale

locale.setlocale(locale.LC_ALL, 'sv_SE.UTF-8')

我也有一个可怕的解决方案和方法,这几年前,它看起来像这样(这是一个伟大的预兆,我当时):

日间;夜间:

您的代码通常假设/使用ASCII作为编码器/解码器。
ö不是ASCII的一部分,如果您了解如何获得unicode字符,那么您将始终看到{}。通常,如果您打印u'Ganztags ge\xf6ffnet',由于自动编码,它将显示为∗,如果您需要验证输入是否与该字符串匹配,则必须将它们进行比较u'ö' == u'ö',如果其他系统依赖于此数据,则使用他们理解的内容对其进行编码.encode('UTF-8')。但是将\xf6替换为ö是同一回事,只是ö在ASCII中不存在,您需要做u'ö'-这将导致最后相同的数据。在

相关问题 更多 >

    热门问题