在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. 使用spool命令从Oracle导出数据

    公司的网站用的是Oracle数据库,最近要导出里面的数据,使用mysql数据库 spool D:\DB\{文件名}.sql set heading off; set echo off; set fee ...

  2. IOS APP配置.plist汇总(转自coolweather )

    IOS APP配置.plist汇总(转自coolweather ) 此文转自http://www.cocoachina.com/bbs/read.php?tid=89684&page=1 作者 ...

  3. CI练手下,找找感觉

    从军哥谈CI框架上看了点点. controller: <?php class Jayjun extends CI_Controller { public function __construct ...

  4. poj3480--John

    题意:n堆石子,两人轮流操作,每次操作只能选定其中一堆,并取走若干个(>=1个).谁取走最后一个谁输.给定一个状态,问先取的赢还是后取的赢. 整个游戏反过来,如果sg为0先手必胜,不为0必败.( ...

  5. PowerShell_零基础自学课程_6_PS中获取帮助信息详解、管道、格式化输

    前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-comm ...

  6. 避免ssh断开导致运行命令的终止:screen

    事情是这样的,需要使用ssh登陆服务器,进行工程的编译,结果不知道什么原因ssh出现write failed:broken pipe,掉线了.反复实验了好几次还是这样(白花花的时间啊,又是config ...

  7. 定位于定位优化(iOS)

    定位于定位优化 1.定位的方案 最近在做项目, 遇到了一个问题就是如何让iOS7~~iOS9的定位.因为项目需求只是需要获取用户所在的城市, 而不用十分具体详细的精确定位, 服务端考虑用区号, 作为标 ...

  8. Java应用开发的一条经验

    一旦为应用建立良好的基础设施, 后续的开发就会变得容易而快速.  这些基础设施包括: 1.   线程池的建立.配置: 在 JDK 并发库的基础上建立更适合于应用的并发使用接口: 2.   跨多数据源的 ...

  9. 【转】Linux下socket keep alive讲解

    [需求]不影响服务器处理的前提下,检测客户端程序是否被强制终了.[现状]服务器端和客户端的Socket都设定了keepalive属性.服务器端设定了探测次数等参数,客户端.服务器只是打开了keepal ...

  10. Linux 程序设计的一些优化措施

    Linux 程序设计的一些优化措施 这些知识是在平常的阅读中,零散的获得的,自己总结了一下,分享在这里 全局变量VS函数参数 全局变量在Linux下的驱动编程里边,用的是非常多,例如中断服务函数ISR ...