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_name
和 last_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)
(if
和 print
语句仅用于演示目的)
相应地使用其他值。
解决方法很简单,我用了get_absolute_url
而不是get_absolute_url()
。抱歉打扰你。
你好,我想像这样将字符串保存到变量中:
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_name
和 last_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)
(if
和 print
语句仅用于演示目的)
相应地使用其他值。
解决方法很简单,我用了get_absolute_url
而不是get_absolute_url()
。抱歉打扰你。