zoukankan      html  css  js  c++  java
  • Django中文无法转换成latin-1编码的解决方案

    在Ubuntu上用Django做Web开发的时候遇到了中文保存到Cookie无法解析的问题,经过了下面几个步骤终于把问题解决了:

    1. 修改/usr/lib/python3.4/wsgiref/headers.py文件,强制使用UTF-8编码
    2. 对存入Cookie的值进行编码,将字符串转换成字节数组
    3. 在页面加载的时候对需要读取的Cookie值使用Javascript进行解码

    以下是具体操作步骤:

    修改/usr/lib/python3.4/wsgiref/headers.py文件,强制使用UTF-8编码

    找到headers.py -> 打开文件 -> 对如下内容进行修改:

    def __bytes__(self):
        return str(self).encode(‘iso-8859-1‘)

    改成:

    def __bytes__(self):
        return str(self).encode(‘utf-8‘)

    经过这个操作,本地运行manager.py runserver的时候已经可以正常记录Cookie了。但是直接部署到Apache的时候,只要涉及到保存中文Cookie的时候就会返回500的错误。Apache log中会显示如下错误信息:

    ...mod_wsgi (pid=5603): Exception occurred processing WSGI script ‘/.../wsgi.py‘.
    ...TypeError: header value contained non ‘latin-1‘ characters

    然后第二步操作,解决网页打开的问题。

    对存入Cookie的值进行编码,将字符串转换成字节数组

    在Django中需要设置Cookie的地方进行如下编码转换:

    def setCookies(response, key, queryCollection):
        if key in queryCollection:
            response.set_cookie(key.lower(), bytes(queryCollection[key], ‘utf-8‘).decode("ISO-8859-1"))
        else:
            response.set_cookie(key.lower(), "")

    这一步完成,保存cookie的问题就解决了,打开网页的时候就可以从服务器接收到正常内容了。

    然后继续第三步,解决Cookie中乱码的问题。

    在页面加载的时候对需要读取的Cookie值使用Javascript进行解码

    在对应的Javascript代码中进行如下转换:

    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(‘;‘);
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==‘ ‘) c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return decodeURIComponent(escape(c.substring(nameEQ.length,c.length).replace(/"/g, "")));
        }
        return null;
    }

    OK!到了这里中文Cookie的问题就都解决了。:-)

  • 相关阅读:
    图片懒加载技术
    验证码处理
    基于requests模块的cookie,session和线程池爬取
    最快理解
    Golang
    Django REST framework
    Django REST framework
    Django
    Django
    搭建邮件服务器 Postfix + Dovecot (CentOS)
  • 原文地址:https://www.cnblogs.com/wu-chao/p/8622334.html
Copyright © 2011-2022 走看看