【问题标题】:Python: Using .format() on a Unicode-escaped stringPython:在 Unicode 转义字符串上使用 .format()
【发布时间】: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() 函数。

【问题讨论】:

    标签: python string unicode python-2.x


    【解决方案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)

      【讨论】:

      猜你喜欢
      • 2015-05-27
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多