我有此代码:
"'{}'".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
答案 0 :(得分:1)
您掉入了一个极端情况的陷阱。 Unicode将U+00A0
(Python表示法中的u'\xa0'
)定义为NO-BREAK SPACE字符。它的打印内容与普通空格(U+0020
或u'\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中都应该提供所需的内容