在Ubuntu上用Django做Web开发的时候遇到了中文保存到Cookie无法解析的问题,经过了下面几个步骤终于把问题解决了:
- 修改/usr/lib/python3.4/wsgiref/headers.py文件,强制使用UTF-8编码
- 对存入Cookie的值进行编码,将字符串转换成字节数组
- 在页面加载的时候对需要读取的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的问题就都解决了。:-)