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


156

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

Answers:


243

只需将第二个字符串也设为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)
≥
>>> 

40
@Kit:如果您希望所有文字都是Unicode(例如在Python 3中),请放在from __future__ import unicode_literals源文件的开头。
菲利普

1
是的,如果您习惯%格式化(因为此“%s”%u“ \ u2265”有效),这将为您带来帮助,但是“ {}”。format(u“ \ u2265”)将引发异常。
希利丹

2
有什么简单的事情..什么可怕的头痛,我得到,直到我发现启蒙此位..
Iosu S.


5

一点的更多信息,为什么出现这种情况。

>>> 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


1
哦,我发现这对于理解python中的unicode和一般计算机系统中的文本表示形式有很大帮助:nedbatchelder.com/text/unipain.html
lps
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.