Python: 对 Unicode 转义字符串使用. format()

我正在使用 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()函数。

104108 次浏览

只要让第二个字符串也是 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)
≥
>>>

unicode需要 unicode格式的字符串。

>>> print u'{0}'.format(s)
≥

更多关于 为什么的信息。

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

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

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

失败是因为 format试图匹配它所调用的类型的编码(我找不到关于这方面的文档,但这是我注意到的行为)。由于字符串文字是在 python2中编码为 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)