在Python 2中格式化u'SÂIOF_1'时出现UnicodeEncodeError

时间:2018-09-25 12:31:31

标签: python string string-formatting python-unicode unicode-literals

我有此代码:

"'{}'".format(u'ES SIOUF_1')

在Python 2中运行时,出现以下错误:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 2: ordinal not in range(128)

从Python 3运行的相同代码给出:

>>> "'ES\xa0SIOUF_1'"

我也不需要。我需要的是:

>>> "'ES SIOUF_1'"

我阅读了许多有关Python中“编码”和“解码”字符的问题,以及Python 2和3在这方面的一些区别。

但是,我真诚地不理解它们,我想针对两个版本的Python解决此问题。

我注意到的是这样做:

type(u'ES SIOUF_1')

给予:

>>> <type 'unicode'> # PYTHON 2
>>> <class 'str'> # PYTHON 3

1 个答案:

答案 0 :(得分:1)

您掉入了一个极端情况的陷阱。 Unicode将U+00A0(Python表示法中的u'\xa0')定义为NO-BREAK SPACE字符。它的打印内容与普通空格(U+0020u'\x20')完全相同,但它是一个独特的字符,不在ASCII范围内。

由于我无法猜测的原因(也许是复制粘贴),您设法在unicode字符串中获得了这个不间断的空间,因此在Python 3中打印很奇怪,并且在Python 2中无法将其转换为ascii。格式是Python 2代码中的一个纯(字节)字符串,该unicode字符串被隐式转换为ascii,这将导致异常。因此,在Python 2中,您需要使用unicode格式才能没有错误:

u"'{}'".format(u'ES SIOUF_1')

将在Python 3中正常工作。

如何解决?

正确的方法是在尝试处理之前消除有问题的u'\x20'。如果不能,则可以用普通空格显式替换它:

"'{}'".format(u'ES SIOUF_1'.replace(u'\xa0', u'\x20'))

在Python 2和Python 3中都应该提供所需的内容