在 Python 2 中格式化 u'ES SIOUF_1' 时出现 UnicodeEncodeError

UnicodeEncodeError when formatting u'ES SIOUF_1' in Python 2

我有这个代码:

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

当 运行 in 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 中阅读了很多关于 "encoding" 和 "decoding" 字符的问题,以及 Python 2 和 3 在这方面的一些差异。

但是,我真的不理解它们,我想尽可能地为 Python 的两个版本解决这个问题。

我注意到的是:

type(u'ES SIOUF_1')

给出:

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

您掉进了角落案例陷阱。 Unicode 将 U+00A0(Python 表示法中的 u'\xa0')定义为 NO-BREAK SPACE 字符。它的打印结果与普通 space(U+0020u'\x20')完全相同,但它是一个不同的字符,不在 ASCII 范围内。

由于我无法猜测的原因(可能是复制粘贴),您设法在您的 unicode 字符串中获得此不间断 space,因此 Python 3 中的奇怪打印和无法在 Python 2 中将其转换为 ascii。由于格式在 Python 2 代码中只是一个(字节)字符串,因此 unicode 字符串被隐式转换为 ascii,这会导致异常。所以在 Python 2 你需要使用 unicode 格式才不会报错:

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

将像在 Python 3.

中一样工作

如何修复?

正确的方法是在尝试处理之前删除有问题的 u'\x20'。如果你不能,你可以用普通的 space:

明确地替换它
"'{}'".format(u'ES SIOUF_1'.replace(u'\xa0', u'\x20'))

应该给你想要的,在Python 2和Python 3