在Python 2.7.12中我想打印一个utf-8字符串: 以下作品:
l = u'übermäßig'
print l
übermäßig
以下不起作用
l = u'übermäßig'
print ("{}").format(l)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 0: ordinal not in range(128)
我花了一些时间...... 谁能告诉我如何在格式化打印中使用utf8字符串? 非常感谢
答案 0 :(得分:0)
这可以解决您的问题:
print u"{}".format(l)
或者,我建议你添加
from __future__ import unicode_literals
到所有脚本的顶部。 或者切换到Python 3。 两者都将为你节省很多痛苦......
...因为{2}中的str
/ unicode
类型混合非常棘手。
我发现帖子中已经有一些混乱:u"übermäßig"
不是UTF-8字符串 - 它是unicode
字符串。
您可能正在使用UTF-8对源代码进行编码,但是当Python解释器解析此文本时,它会将其转换为不再需要关心编码的对象(无论是UTF-8,UTF-16,拉丁语-1或其他)。
在许多情况下,您可以自由混合str
和unicode
类型。
如果您输入
"{}" + u"übermäßig"
然后Python会在连接两个对象之前将(byte)字符串"{}"
升级为unicode
。
这称为隐式强制。
然而,在
的情况下"{}".format(u"übermäßig")
您正在使用format()
类型的str
方法,并且不会发生强制攻击。
相反,str.format()
方法强制将其参数转换为str
,即。它必须将unicode
“降级”为str
。
它与调用str(u"übermäßig")
相同,后者需要编码 Unicode字符串。
这种情况下的默认编解码器是ASCII,它不能处理“ü”,“ä”或“ß”。
相反,u"{}".format(u"übermäßig")
使用unicode.format()
方法,该方法(当然)需要类型为unicode
的参数。
通过使用上面提到的unicode_literals
pragma,所有字符串文字"..."
都被解释为它们已被写为u"..."
。
在大多数情况下,这就是你想要的;如果您确实需要字节字符串,请改为编写b"..."
。
这就是Python 3的工作方式。