如何制作python 2.7 print({})。format(utf8string)

时间:2018-01-09 20:04:38

标签: python-2.7 utf-8

在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字符串? 非常感谢

1 个答案:

答案 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或其他)。

在许多情况下,您可以自由混合strunicode类型。 如果您输入

"{}" + 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的工作方式。