使用Django,我正在尝试编写一个视图,将通过表单(request.POST['item']
)的提交与该行中数据库中已有的内容进行比较。
我正在使用Entry.objects.values_list('item', flat=True)
,但这会给我一个unicode
个对象的列表,这些对象会抛弃比较。
如何在没有unicode
?
答案 0 :(得分:1)
要创建unicode
对象,您可以使用
from settings import DEFAULT_CHARSET
s = unicode(request.POST['item'], request.encoding or DEFAULT_CHARSET)
请注意,request.POST
中的项目应该已经是unicode
类型,因此不需要转换。
In [1]: a = u'Täöüß'
In [2]: a
Out[2]: u'T\xe4\xf6\xfc\xdf'
In [3]: type(a)
Out[3]: unicode
以下内容适用于unicode
无需执行任何操作:
In [4]: unicode(a)
Out[4]: u'T\xe4\xf6\xfc\xdf'
强制unicode
从utf-8
编码解码,但必须失败,因为a
不是8位字符串而是unicode
变量:
In [5]: unicode(a, 'utf-8')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
----> 1 unicode(a, 'utf-8')
TypeError: decoding Unicode is not supported
您可以在.encode(encoding)
对象上使用unicode
来创建8位字符串版本:
In [6]: utf8 = a.encode('utf-8')
In [7]: latin1 = a.encode('latin-1')
In [8]: latin1
Out[8]: 'T\xe4\xf6\xfc\xdf'
In [9]: utf8
Out[9]: 'T\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f'
请注意,生成的字符串属于str
类型,而 类型为unicode
。
如果您获得str
- 类型数据并知道相应的编码,您可以创建unicode
这样的对象:
In [10]: b = unicode(latin1)
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
----> 1 b = unicode(latin1)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 1:
ordinal not in range(128)
这必须失败,因为没有给出编码,这意味着假设ascii
的默认编码(当然,它无法处理0xe4
)。
In [11]: b = unicode(latin1, 'utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
----> 1 b = unicode(latin1, 'utf-8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 1:
invalid continuation byte
使用错误的编码,在这种情况下尝试在处理utf-8
字符串时从latin-1
解码,也会引发UnicodeDecodeError
。
In [12]: b = unicode(latin1, 'latin-1')
使用正确的编码将允许为给定的unicode
实例创建str
对象。 b
等于a
:
In [13]: b == a
Out[13]: True
使用此信息,您应该能够在任何需要的地方创建unicode
个实例,从而将request.POST
数据与数据库中的值进行比较。
有关Python中Unicode处理的更多信息,请访问http://docs.python.org/howto/unicode.html
Django关于Unicode数据的文档可以在https://docs.djangoproject.com/en/dev/ref/unicode/
找到希望有所帮助。