在 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+0020
或 u'\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
我有这个代码:
"'{}'".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+0020
或 u'\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