使用 Django,我正在尝试编写一个视图,将通过表单 ( request.POST['item']
) 提交的内容与该行中数据库中已有的内容进行比较。
我正在使用Entry.objects.values_list('item', flat=True)
,但这给了我一个unicode
对象列表,它会引发比较。
如果没有 ,我如何才能将这些对象作为纯列表获取unicode
?
要创建unicode
对象,您可以使用
from settings import DEFAULT_CHARSET
s = unicode(request.POST['item'], request.encoding or DEFAULT_CHARSET)
请注意,里面的项目request.POST
应该已经是 type 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'
请注意,生成的字符串是 typestr
而不是type unicode
。
如果给定了str
-typed 数据并且知道相应的编码,则可以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/
希望有帮助。