0

使用 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 中,上面的示例可以正常工作。

4

1 回答 1

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 值,常规字符串 ( "...") 是字节字符串。

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

于 2013-09-18T08:08:40.817 回答