Python 格式 UnicodeDecodeError

Python format UnicodeDecodeError

你好,我想像这样将字符串保存到变量中:

  msg=_(u'Uživatel <a href="{0}">{1} {3}</a>').format(request.user.get_absolute_url, request.user.first_name, request.user.last_name)

但是由于插入的变量包含带有重音符号的字符,例如 š 我得到了 UnicodeDecodeError 即使我已经设置了编码 # -*- coding: utf-8 -*-

奇怪的是(恕我直言)当我通过像这样连接变量来创建这个字符串时它正在工作:

msg=u'Uživatel <a href="' + request.user.get_absolute_url + ...

我不知道为什么它在 运行 项目后不能正常工作,我不得不多次使用这样的语句。

如果您有任何解决此问题的建议,我将不胜感激。

您的一个 user 查找返回编码字节串而不是 Unicode 对象。

当 Python 2.x 被要求连接 Unicode 和编码的字节串时,它通过使用默认编码将字节串解码为 Unicode 来实现,即 ascii 除非你去一些努力来改变它。 # -*- coding: utf-8 -*- 指令设置源代码的编码,但不是系统默认编码。

根据测试 format,它似乎试图转换参数以匹配左侧的类型。

在 2.x 下,只要您使用的字节串可以使用 ascii:

进行解码,一切都会正常进行
>>> u'test\u270c {0}'.format('bar')
u'test\u270c bar'

或者您当然要在另一个 Unicode 对象中进行格式化:

>>> u'test\u270c {0}'.format(u'bar\u270d')
u'test\u270c bar\u270d'

如果您在格式前省略 u,您将得到 UnicodeEncodeError:

>>> 'foo {0}'.format(u'test\u270c')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u270c' in position 4: ordinal not in range(128)

相反,如果将非 ascii 字节的编码字符串格式化为 Unicode 对象,您将得到 UnicodeDecodeError:

>>> u'foo {0}'.format(test.encode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 4: ordinal not in range(128)

我将从检查 get_absolute_url 实现开始。有效的 URL 永远不能包含未转义的非 ascii 字符,所以它们应该总是可以被 ascii 解码,但是如果你使用的是从标准 Django 模型构建的东西 first_namelast_name 应该是 Unicode 对象所以我'一开始我打赌 get_absolute_url 的错误实现。

检查格式化参数的类型,我猜它们是 'str',而不是 'unicode'。 在使用它们之前,对它们进行适当的编码,例如:

url = request.user.get_absolute_url
if isinstance(url, str):
    print 'url was str'
    a = url.decode('utf-8')
msg = u'Uživatel <a href="{0}">...</a>').format(url)

ifprint 语句仅用于演示目的) 相应地使用其他值。

解决方法很简单,我用了get_absolute_url而不是get_absolute_url()。抱歉打扰你。