python 2.7中字符串格式的奇怪行为

时间:2013-09-18 07:39:42

标签: python string python-2.7 format

使用xml格式的svn日志我在脚本中意外地出错了。 错误信息是:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

通过调试输入数据我发现了什么问题。这是一个例子:

a=u'\u0440\u0435\u044c\u0434\u0437\u0444\u043a\u044b\u0443\u043a \u043c\u0443\u043a\u044b\u0448\u0449\u0442 \u0430\u0448\u0447'
>>> print a
реьдзфкыук мукышщт ашч
>>> print '{}'.format(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

你能解释一下格式有什么问题吗? 好像它在字符串字节之前看到 u 并尝试从UTF8解码它。 但是在上面的Python 3中,示例可以正常工作。

1 个答案:

答案 0 :(得分:2)

您正在混合Unicode和字节字符串值。使用 unicode 格式:

print u'{}'.format(a)

演示:

>>> a=u'\u0440\u0435\u044c\u0434\u0437\u0444\u043a\u044b\u0443\u043a \u043c\u0443\u043a\u044b\u0448\u0449\u0442 \u0430\u0448\u0447'
>>> print u'{}'.format(a)
реьдзфкыук мукышщт ашч

在Python 3中,字符串默认为unicode值;在Python 2中,u"..."表示unicode值,常规字符串("...")表示 byte 字符串。

混合字节字符串和unicode值会导致使用默认编解码器(ASCII)自动编码或解码,这就是这里发生的事情。 str.format()方法必须将Unicode值编码为要插值的字节字符串。