在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. Handlebars expressions

    Basic Usage 1,最简单的handlebars 表达式 <h1>{{title}}</h1> 使用时,会在当前context里找名为title的property,替换 ...

  2. 换行word-wrap与word-break兼容IE和FIREFOX -----设计师零张

    word-wrap是控制换行的.使用break-word时,是将强制换行.中文没有任何问题,英文语句也没问题.但是对于长串的英文,就不起作用.word-break是控制是否断词的.normal是默认情 ...

  3. py2exe生成exe后,运行exe时提示No module named * 的解决办法

    一个pymssql 的程序在解释器上运行正常,但是用py2exe打包后,提示 ImportError: No module named _mssql 百度了半天无果,然后bing,结果bing还是比百 ...

  4. ByteArrayOutputStream的用法

    ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的 ...

  5. print带参数格式

    string_1 = "Camelot" string_2 = "place" print("float:%lf. int:%d string:%s. ...

  6. Linux Top 命令

    TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况. TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止 ...

  7. 程序员求职之道(《程序员面试笔试宝典》)之程序设计基础(static的使用)?

    在C语言中,关键字static的意思是静态,它有三个明显的作用:首先,在函数体内,静态变量具有"记忆"功能,即一个被声明为静态的变量在这一函数被调用过程中其值维持不变.其次,在模块 ...

  8. 【转】网络视频监控P2P解决方案

    一.摘要 本文分析了日益增长的民用级别家庭和个人网络视频监控市场的需求特点,并给出了一种经济可行易于大规模部署的P2P解决方案. 由于篇幅有限,本文只给出了方案的思路,未对更深入的技术细节做详细的论述 ...

  9. hbase单机安装

    1.网上内容比较混乱,其实安装单机hbase只需要安装hbase即可 2.把hbase-0.xxx.tart.gz 拷贝到/opt/hbase文件及下(这是安装目录,可自定义) 2.1 tar xfz ...

  10. js中取session的值

    在js中貌似不能取session的值,我在后台设置的session一直拿不到,于是用间接的方式拿到session的值. 首先在jsp中嵌入java代码,用java设置一个变量来取session值,再在 ...