0

我有这个代码:

"'{}'".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
4

1 回答 1

1

你掉进了一个角落里的陷阱。Unicode 将U+00A0u'\xa0'以 Python 表示法)定义为 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 中给出你想要的

于 2018-09-25T13:21:47.967 回答