使用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中,示例可以正常工作。
答案 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值编码为要插值的字节字符串。