首页 文章

Django请求unicode字符串错误地UTF-8编码

提问于
浏览
0

我在使我的网站与重音字符(法语网站)兼容时遇到了一些麻烦 .

我有一个表单,其中一些字段值可以与重音字符:例如“双门轿跑车” .

我的网址如下所示:

http://localhost:8080/recherches/s?marque=Audi&modeles=A5+Coup%C3%A9

在我的django视图中,我做了类似这样的事情:

def search(request):
  logger = logging.getLogger('custom')
  criteria_form = CriteriaForm(request.GET or None)
  logger.debug("search")
  logger.debug(request.GET)

我在日志中得到的是:

<QueryDict: {u'marque': [u'Audi'], u'modeles': [u'A5 Coup\xc3\xa9']}>

如果我用这个变量“modeles”查询我的数据库,我收到一个错误:

>>> mo = u'A5 Coup\xc3\xa9'
>>> Vehicule.objects.filter(valid=True, modele=mo)[0].marque.name
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 211, in __getitem__
    return list(qs)[0]
IndexError: list index out of range

如果我使用utf-8版本查询数据库,情况会有效:

>>> mo = 'A5 Coup\xc3\xa9'
>>> Vehicule.objects.filter(valid=True, modele=mo)[0].marque.name
u'Audi'

所以我认为(但我可能错了)我的问题来自于我的变量是utf8然后用unicode编码的事实 .

怎么这样编码?

第一次回复后更新:

在发送表单的页面的 Headers 上有:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>

但是,如果我在views.py中打印编码:

logger.debug(request.encoding)

然后我得到无 .

但我不知道如何设置此编码 . 我以为它会像我上面那样从 Headers 中...

我在HTTP_ACCEPT_CHARSET中也有这个:

HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.3

可以来自这里吗?如果是,我应该如何改变?

2 回答

  • 1

    我终于找到了问题 . 我用一个全新的django应用程序测试了这个问题 . No DB,一个在页面中显示表单内容的简单视图 . 像这样的东西:

    # -*- coding: utf-8 -*-
    from django.shortcuts import render_to_response
    from django.template import RequestContext
    
    
    def test(request):
      found = request.GET.get('modeles')
      print found
      return render_to_response('test.html',
                                {"found":found},
                                context_instance=RequestContext(request))
    

    如果我打开网址

    localhost:8080/mysite?modeles=Coupé
    

    我得到了错误格式的Coupé

    在这里,我肯定不能责怪任何ajax,或db调用或我在python中可以做的任何事情 .

    所以我只是尝试使用Django 1.4 ......它就像一个魅力!然后我尝试了最新的Django 1.5a1版本,它也有效......

    我想我现在不应该使用测试版 . 我会坚持1.4!

    希望这能为其他人节省时间 .

  • 0

    随着所有验证魔法在后台发生,通过绕过所有这些可能更容易查明问题 . 在您看来,以下产生了什么?

    Vehicule.objects.filter(valid=True, modele=request.GET['mo'])[0].marque.name
    

    如果你所做的只是传递一个查询,那么你的巨大的Ajaxariffic验证集会在你获得值之前对你的unicode做一些奇怪的Python事情,并且可能会把你的特殊字符敲掉 .

    编辑:自己玩这个后,看起来像GET中的urlified数据是问题 . 而不是这样做和string.encode('iso8859-1') . decode('utf8'),更改表单以提交POST数据并使用它更容易 .

相关问题