如何使用Django从数据库中获取非unicode字符串?

时间:2012-04-14 05:18:40

标签: python django unicode

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

我正在使用Entry.objects.values_list('item', flat=True),但这会给我一个unicode个对象的列表,这些对象会抛弃比较。

如何在没有unicode

的情况下将这些对象作为纯列表获取

1 个答案:

答案 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'

强制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'

请注意,生成的字符串属于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/

找到

希望有所帮助。