16

我在使用 Pythonstring.format()并将 Unicode 字符串传递给它时遇到问题。这类似于这个较早的问题,除了在我的情况下,测试代码在打印时爆炸,而不是在logging.info()调用时爆炸。将相同的 Unicode 字符串对象传递给日志处理程序可以正常工作。

这与旧%格式以及string.format(). 只是为了确保问题出在字符串对象上,而不是打印与我的终端交互不良,我尝试在打印之前将格式化的字符串分配给一个变量。

def unicode_test():
    byte_string = '\xc3\xb4'
    unicode_string = unicode(byte_string, "utf-8")
    print "unicode object type: {}".format(type(unicode_string))
    output_string = "printed unicode object: {}".format(unicode_string)
    print output_string

if __name__ == '__main__':
    unicode_test()

字符串对象似乎假设它正在获取 ASCII。

% python -V
Python 2.7.2

% python ./unicodetest.py
unicode object type: <type 'unicode'>
Traceback (most recent call last):
  File "./unicodetest.py", line 10, in <module>
    unicode_test()
  File "./unicodetest.py", line 6, in unicode_test
    output_string = "printed unicode object: {}".format(unicode_string)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf4' in position 0: ordinal not in range(128)

尝试转换output_string为 Unicode 没有任何区别。

output_string = u"打印的 unicode 对象:{}".format(unicode_string)

我在这里错过了什么吗?字符串对象的文档似乎很清楚,这应该可以在我尝试使用它时起作用。

4

1 回答 1

23

不,这不应该起作用(你能引用文档中这样说的部分吗?),但如果格式模式是 unicode(或者使用旧格式将模式“提升”为 unicode 而不是尝试“降级”),它应该可以工作' 论点)。

>>> x = "\xc3\xb4".decode('utf-8')
>>> x
u'\xf4'
>>> x + 'a'
u'\xf4a'
>>> 'a' + x
u'a\xf4'
>>> 'a %s' % x
u'a \xf4'
>>> 'a {}'.format(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec 
  can't encode character u'\xf4' in position 0: ordinal not in range(128)
>>> u'a {}'.format(x)
u'a \xf4'
>>> print u"Foo bar {}".format(x)
Foo bar ô

编辑:print如果无法使用控制台的编码对 unicode 字符串进行编码,则该行可能对您不起作用。例如,在我的 Windows 控制台上:

>>> import sys
>>> sys.stdout.encoding
'cp852'
>>> u'\xf4'.encode('cp852')
'\x93'

在 UNIX 控制台上,这可能与您的区域设置有关。|如果您重定向输出(例如在 shell 中使用时),它也会失败。大多数此类问题已在 Python 3 中得到修复。

于 2012-12-02T22:50:47.417 回答