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

时间: 2024-12-21 17:07:37

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

中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八--&gt;12345678)

昨天老大问我又没有写过中文数字转换成阿拉伯数字,我说没有,我说那应该简单啊,就是将中文对应的数字换成阿拉伯数字就好了啊,比如一就换成1,二就换成2…十换成10.可是那么问题来了…… 一十二呢…不能是1102吧…这不就坑爹了吗?一百万呢………所有我苦苦思索,花费了我差不多半天的时间,终于写出了下面的程序. 1 public static void main(String[] args){ 2 3 Map<Character, String> numberMap = new HashMap<

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

问题的场景: html 为utf-8编码<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> form 产生一些中文输入项提交到后台: 后台通过file_get_contents('php://input');接收 使用var_dump,echo 等显示接收字符串为 utf-8形式,通过iconv()转换,结果依然如此: 后使用urldecode() 后,能正常显示中文.前

将中文数字转换成英文表示

public class NumberToWords { private final String[] tensNames = { "", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninet

批量将ANSI文本txt文件转换成UTF8编码格式 (vbs方法)

准备两个文件即可 conv.vbs run.bat conv.vbs源码 '用法:将要更改编码的所有文件放到同一个文件夹中,将文件夹拖到该vbs上,输入要转换成的字符编码 Dim fso,fd,fl,f,fdpath,charset On Error Resume Next If WScript.Arguments.Length>=1 Then fdpath = WScript.Arguments(0) Else fdpath = InputBox("E:\xunlian\新增加的训练集&

中文转换成Unicode编码 和 Unicode编码转换为中文

前几天,遇到一个问题,就是在浏览器地址栏传递中文时,出现乱码,考虑了一下,解决方式有很多,我还是采用了转换编码的方式,将中文转换为Unicode编码,然后再解码成中文,以下是实现的过程,非常简单! package cy.code; public class CyEncoder { private String zhStr; //中文字符串 private String unicode;//将中文字符串转换为Unicode编码 存储在这个属性上. public CyEncoder(String z

Python3的unicode编码转换成中文问题

Python3的unicode编码转换成中文问题 从别的地方搬过来的,担心以后不容易搜索到,就收集过来. 我当时面临的问题是要从C++发json代码出来,用python写了个server,然后返回给C++程序,结果收到的是:httpSvrDataCbUser: {"tranNO": "0808ad498670dc996", "data": "\u65b0A1EY16", "ver": "1.0&q

C#汉字转拼音(npinyin)将中文转换成拼音全文或首字母

汉字转拼音貌似一直是C#开发的一个难题,无论什么方案都有一定的bug,之前使用了两种方案. 1.Chinese2Spell.cs 一些不能识别的汉字全部转为Z 2.Microsoft Visual Studio International Feature Pack 1.0  连"广".“区”都不能转,很让人失望. 这些都是2010年以前的方案,至少还有大侠在为汉字转拼音不断努力着,目前发现最完美的就是NPINYIN,在googlecode可以看到它的开源项目,http://code.g

在C#中将金额转换成中文大写金额

具体代码如下: /// <summary> /// 金额转换成中文大写金额 /// </summary> /// <param name="LowerMoney">eg:10.74</param> /// <returns></returns> public static string MoneyToUpper(string LowerMoney) { string functionReturnValue = nu

把man手册转换成中文

1  *  Copyright (c) 2012级, 烟台大学计算机学院 2  *  All rights reserved. 3  *  作者:付记超 4  *  完成日期:2015 年 6 月 6 日 5  *  版 本 号:v1.0 6  *  学习主题:把man手册转换成中文 7  *  使用环境:红帽5.8 8  *  使用好处: 9  *  使用时间: 10 *  如何使用: 11 *  学习内容:安装man-pages中文手册包 欢迎指正 QQ:2272172668  Email: