0

使用 Django,我正在尝试编写一个视图,将通过表单 ( request.POST['item']) 提交的内容与该行中数据库中已有的内容进行比较。

我正在使用Entry.objects.values_list('item', flat=True),但这给了我一个unicode对象列表,它会引发比较。

如果没有 ,我如何才能将这些对象作为纯列表获取unicode

4

1 回答 1

1

要创建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'

但是,强制unicodeutf-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/

希望有帮助。

于 2012-04-14T06:13:38.280 回答