【问题标题】:UnicodeEncodeError when formatting u'ES SIOUF_1' in Python 2在 Python 2 中格式化 u'ES SIOUF_1' 时出现 UnicodeEncodeError
【发布时间】:2019-03-01 02:03:09
【问题描述】:

我有这个代码:

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

【问题讨论】:

  • 一定是错字(大括号之间有一个额外的字符),因为它对我有用(如果我复制/粘贴你的字符串)。
  • 嗯,实际上,它是 "'{}'".format(u'ES SIOUF_1') 所以它是正确的。怎么可能为你工作而不为我工作?
  • 好的,这很奇怪....当我将此处编写的代码复制并粘贴到我的 IDE (PyScripter) 中时,我没有收到错误消息。但是,当我从命令历史记录中复制并粘贴相同的代码时,我会收到它。 WinMerge 显示“空白”字符存在差异。但是“在我看来”它们确实是相同的。这是怎么回事????难道是“那个空间”在“复制粘贴”中的类型不同???

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


【解决方案1】:

你掉进了一个角落里的陷阱。 Unicode 将U+00A0(Python 表示法中的u'\xa0')定义为无间断空格字符。它与普通空格(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 中提供你想要的东西

【讨论】:

  • 哇,我很惊讶!...谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2017-02-02
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多