在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的问题就都解决了。:-)

Django中文无法转换成latin-1编码的解决方案的更多相关文章

  1. Python2.X如何将Unicode中文字符串转换成 string字符串

    Python2.X如何将Unicode中文字符串转换成 string字符串   普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:unicodestring = u&q ...

  2. 字符串js编码转换成实体html编码的方法(防范XSS攻击)

    js代码在html页面中转换成实体html编码的方法一: <!DOCTYPE html><html> <head>    <title>js代码转换成实 ...

  3. .NET中将中文符号转换成英文符号

    public static string ConvertToEn(string text) { const string s1 = ".:,?!.“”‘’"; const stri ...

  4. javascript 将中文符号转换成英文符号

      javascript 将中文符号转换成英文符号 CreateTime--2018年3月30日09:01:29 Author:Marydon /** * 将中文符号转换成英文符号 */ functi ...

  5. 使用 js 实现一个中文自动转换成拼音的工具库

    使用 js 实现一个中文自动转换成拼音的工具库 中文 => zhong-wen 应用场景 SEO 友好, URL 自动转换 blogs 发布文章,自动化部署,自动生成 url 的 path (时 ...

  6. Base64字符保存图片,图片转换成Base64字符编码

    //文件转换成Base64编码 public static String getFileBase64Str(String filePath) throws IOException { String f ...

  7. PHP怎么把经过UTF-8编码的中文字符转换成正常的中文

    问题的场景: html 为utf-8编码<meta http-equiv="Content-Type" content="text/html; charset=UT ...

  8. django QuerySet对象转换成字典对象

    >>> from django.contrib.auth.models import User >>> from django.forms.models impor ...

  9. 解决nginx在记录post数据时 中文字符转成16进制的问题【转载】

    1. 问题描述 nginx 在获取post数据时候,如果是中文,则转换成16进制显示在日志文件中,如下图所示.   Paste_Image.png 日志格式为: log_format postdata ...

随机推荐

  1. JavaWeb学习笔记--2.jsp指令元素、动作元素、内置对象

    目录: 一.指令 1.1 page指令 :page指令有13种属性 1.2 include指令:include指令有1种属性,为file.(注意<%@ include%>和<jsp: ...

  2. 数组对象-new Array

    声明空数组    var arr = new Array(); 声明指定长度的数组          var arr = new Array(5) 声明初始值的数组             var a ...

  3. oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法

    近期需要一个汇总统计,由于数据太多,数据量太大所以在java程序中实现比较困难.若用后台程序统计,数据不能保证实时,同时实现周期比较长.顾使用函数返回结果集的方式,在不增加临时表的情况下实时获取数据. ...

  4. Longest Valid Parentheses 解答

    Question Given a string containing just the characters '(' and ')', find the length of the longest v ...

  5. bzoj2049-洞穴勘测(动态树lct模板题)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  6. 关于vs的lib文件和dll文件

    一.LIB文件概念 一个lib文件是obj文件的集合.当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件 二.与DLL的区别 (1)lib是编译时需要的,dll是运行时 ...

  7. Java实现配置加载机制

    前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty…等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这 ...

  8. 后台数据导出为Excel

    数据导出的方法如下: 一.下载office的类库:microsoft.office.interop.excel.zip 根据电脑安装的office版本选择引入相应的类库,office2007选择12. ...

  9. PHP操作MySQL数据库的相关函数

    首先,要分清SQL语句的类型: SQL语句的分类 (1)DDL:Data Define Language,数据定义语言--定义表的列结构 CREATE.DROP.ALTER.TRUNCATE (2)D ...

  10. The Frog's Games(二分)

    The Frog's Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) ...