【问题标题】:Strange behavior of string format in python 2.7python 2.7中字符串格式的奇怪行为
【发布时间】:2013-09-18 07:39:42
【问题描述】:

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

【问题讨论】:

  • Python 3 的字符串和 Python 2 的 unicode 对象是一样的,这里用u"..." 值表示。

标签: python string python-2.7 format


【解决方案1】:

您正在混合使用 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 值编码为字节字符串以进行插值。

【讨论】:

  • 如果我使用: print '%s' % (a) 它打印时没有错误,只有格式会出错。您能否提供任何其他会出现以下错误的示例?
  • % 格式参数然后将字符串格式强制转换为 Unicode;这同样是有问题的(另一个隐式转换),这恰好起作用,因为您的格式中只有 ASCII 字节。还有很多其他有问题的情况; concat unicode 和编码字节也会导致隐式转换。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多