使用 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/
希望有帮助。