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

Posted

技术标签:

【中文标题】Python:在 Unicode 转义字符串上使用 .format()【英文标题】:Python: Using .format() on a Unicode-escaped string 【发布时间】:2011-03-15 04:54:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

@Kit:如果您希望所有文字都是 Unicode(如在 Python 3 中),请将 from __future__ import unicode_literals 放在源文件的开头。 是的,如果你习惯于 % 格式化,这会让你受益匪浅,因为这个 "%s" % u"\u2265" 有效,但是 "".format(u"\u2265")会抛出异常。 多么简单的事情……直到我找到了一点启示……我头疼得厉害……【参考方案2】:

unicodes 需要unicode 格式字符串。

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

【讨论】:

【参考方案3】:

更多关于为什么会发生的信息。

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

之所以有效,是因为print 自动为您的环境使用系统编码,该编码可能设置为 UTF-8。 (您可以通过import sys; print sys.stdout.encoding查看)

&gt;&gt;&gt; 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)

【讨论】:

哦,我发现这对理解 python 中的 unicode 以及一般计算机系统中的文本表示有很大帮助:nedbatchelder.com/text/unipain.html

以上是关于Python:在 Unicode 转义字符串上使用 .format()的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7:如何将字符串中的 unicode 转义转换为实际的 utf-8 字符

Python日志记录:unicode符号是unicode转义的[重复]

将 Python 转义的 unicode 序列转换为 UTF-8

PyQt5 unicode 翻译:pylupdate5 输出转义序列

python2模块中unicode中的转义控制字符

python oauthlib:在转义 ValueError 中“只有 unicode 对象是可转义的”