String.format() 和 % 格式化与 Unicode 数据的区别

4

随着

print("    {:d}). {:s} ({:d})".format(i, account, num_char))

我收到了这个错误信息:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 4: ordinal not in range(128)

但是当我将它更改为:
print "    %d). %s (%d)" % (i, account, num_char)

那么在这两种打印方式中,没有问题且输出结果相同。

那么第一个表达式出了什么问题,为什么第二个表达式可以正常工作呢?


.encode("utf-8") 但如果其中一个引起错误,两个打印输出的结果如何相同? - Padraic Cunningham
@Karl Knechtel 我的问题在标题中...但是有人改变了我的标题 :) 我想知道为什么第一个打印出错,而第二个是正常的 - XnIcRaM
是的,这个问题在编辑时不应该被删除,但我喜欢这个标题,因为它比“有什么问题”更具体,而后者太过笼统。我进行了编辑,并将问题放在了正确的位置(问题正文中)。希望这样可以。 - Trilarion
1个回答

8
在第一个示例中,您正在调用str对象的format方法并传递unicode参数。这会导致错误。应使用:
print(u"    {:d}). {:s} ({:d})".format(i, account, num_char))

相反,第二种方法使用了%运算符,当格式或对象为unicode时,它会自动返回unicode类型。根据文档:

  1. 如果提供的对象或格式是Unicode字符串,则生成的字符串也将是Unicode字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接