161

我正在使用 Python 2.6.5。我的代码需要使用“大于或等于”符号。它是这样的:

>>> s = u'\u2265'
>>> print s
>>> ≥
>>> print "{0}".format(s)
Traceback (most recent call last):
     File "<input>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265'
  in position 0: ordinal not in range(128)`  

为什么我会收到此错误?有正确的方法吗?我需要使用该.format()功能。

4

3 回答 3

247

只需将第二个字符串也设为 unicode 字符串

>>> s = u'\u2265'
>>> print s
≥
>>> print "{0}".format(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
>>> print u"{0}".format(s)
≥
>>> 
于 2010-07-13T08:34:48.443 回答
71

unicodes 需要unicode格式字符串。

>>> print u'{0}'.format(s)
≥
于 2010-07-13T08:35:36.397 回答
8

关于为什么会发生这种情况的更多信息。

>>> s = u'\u2265'
>>> print s

工作,因为print自动为您的环境使用系统编码,这可能设置为 UTF-8。(你可以通过做检查import sys; print sys.stdout.encoding

>>> print "{0}".format(s)

失败是因为format尝试匹配调用它的类型的编码(我找不到关于此的文档,但这是我注意到的行为)。由于字符串文字是在 python 2 中编码为 ASCII 的字节字符串,因此format尝试编码s为 ASCII,然后导致该异常。观察:

>>> s = u'\u2265'
>>> s.encode('ascii')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)

所以这基本上就是这些方法有效的原因:

>>> s = u'\u2265'
>>> print u'{}'.format(s)
≥
>>> print '{}'.format(s.encode('utf-8'))
≥

源字符集由编码声明定义;如果源文件中没有给出编码声明,则为 ASCII ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )

于 2019-03-18T19:15:12.123 回答