【问题标题】:Foreign character breaking when posted via multipart/form-data通过 multipart/form-data 发布时外来字符中断
【发布时间】:2012-02-17 04:53:31
【问题描述】:

我在 google-app-engine 上使用 django-nonrel。

当我发布外国角色时,

在我的例子中是韩文字符,它带有一个多部分/表单数据,它正在破坏。

<form method="post" enctype="multipart/form-data" action=".">

例如,如果我发布一个字符串'한글'

它作为字符串'7ZWc6riA'记录在我的数据库中。

根据我的研究这是jsp中的常见情况,

在 Java 中它的解决方法如下:

String name = multipartRequest.getParameter("name");
name = new String(name.getBytes("8859_1"),"utf-8");

但是,我无法在 Django 中找到等价物,

也不太确定我是否可以用同样的逻辑解决我的问题。

任何帮助/线索将不胜感激。

【问题讨论】:

  • 您的页面是否有设置 utf-8 内容类型的标题和元标记?顺便说一句,您的代码等效于:name.decode('utf-8') 如果名称是字节串。
  • “破解”如何?向我们展示相关代码和堆栈跟踪!

标签: django google-app-engine multipartform-data django-nonrel


【解决方案1】:

我发现了这个问题的未解决问题。

问题 2749:Blobstore 处理程序破坏数据编码 http://code.google.com/p/googleappengine/issues/detail?id=2749

您可以在上面的链接中找到几个不同的选项来解决此错误。

就个人而言,作为 Django-nonrel 用户,我会采用如下所示的解决方案:

import logging
import quopri
log = logging.getLogger(__name__)

    class BlobRedirectFixMiddleware(object):
        def process_request(self, request):
            if request.method == 'POST' and 'HTTP_X_APPENGINE_BLOBUPLOAD' in request.META and request.META['HTTP_X_APPENGINE_BLOBUPLOAD'] == 'true':
                request.POST = request.POST.copy()
                log.info('POST before decoding: %s' % request.POST)
                for key in request.POST:
                    if key.startswith('_') or key == u'csrfmiddlewaretoken':
                        continue
                    value = request.POST[key]
                    if isinstance(value,(str, unicode)):
                        request.POST[key] = unicode(quopri.decodestring(value), 'iso_8859-2')
                log.info('POST after decoding: %s' % request.POST) 
            return None

【讨论】:

    【解决方案2】:

    问题很可能出在您提供的 HTML 而不是 Django 上。我正在使用 HTML5,我只需要在我的元素中使用这个元标记。各种语言都试过了,都输入正常。

    <head>
    <meta charset="UTF-8" />
    </head>
    

    【讨论】:

    • 我的 HTML 中没有元标记,但添加它并没有解决我的问题。当我在 windows 2003 服务器上使用 mySQL 以及在我的 Mac OSX Lion 上运行的 Django 开发服务器上时,我没有遇到这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多