Django编码相关的配置解析
本文用于技术交流和探讨,转载请注明出处和作者。
1. 数据库字符编码
确保数据库能存储任何数据格式, 一般我们选用UTF-8. 选用其他数据格式的话如亚洲地区比较常用的latin1,会有些字符不能存储,导致信息丢失!(从一定意义上来说使用latin1是导致很多奇怪的字符编码问题的罪魁祸首)所以推荐大家创建数据库是选用utf8格式,为latin1受的苦还不够吗 :<
在MySQL中我们使用以下方式创建一个utf8字符集的数据库:
与数据库通信时,Django内部把Unicode转换成正确的编码格式,同时也自动地把从数据库获取到的字符串转换为Unicode格式。你甚至不需要告诉Django 你的数据库使用什么编码方式, 对用户来说,这一切都是透明的。
2. DEFAULT_CHARSET
起名为DEFAULT_CHARSET实在是对开发人员一个大大的误导,从一定程度上来说,它并不是什么default charset,不要愚蠢的以为只要你设置了DEFAULT_CHARSET ,Django就会如你所愿循规蹈矩的工作了。 字符串自身并没有携带足够的信息来告诉我们它使用了什么编码格式,所以在迷茫的时候面临抉择的时候Django还是会自作主张的使用utf-8作为编码格式。 Django的哲学认为, DEFAULT_CHARSET是由客户程序员或者直接的终端客户来设置的, 不管他们选择什么编码格式,程序还得继续工作呀, (起码不能抛出一个什么UnicodeEncodeError之类的异常吧) 为了一探究竟,我们来看看Django到底在哪些地方使用了DEFAULT_CHARSET
./django/http/__init__.py
./django/core/mail.py
发现了两个文件,有心的读者可以自己研读一下详细代码。 很明显, 它只作用于http通信和邮件数据通信。 在接收http请求时, 将浏览器发送过来的数据转换为unicode, 在发送http响应时将Django内部数据编码为DEFAULT_CHARSET格式并设置页面字符集为DEFAULT_CHARSET(Django默认设置为utf-8)。
3. FILE_CHARSET
这是Django1.0中新增的一个配置,同样我们还是先看一下它在哪里被使用到
./django/core/management/sql.py
./django//template/loaders/app_directories.py
表明FILE_CHARSET只是用于模板加载和读取sql初始化文件是用到。Django将使用FILE_CHARSET来对页面模板文件和sql初始化文件进行解析。
Django把FILE_CHARSET默认设置为utf-8
4. 页面字符集
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
浏览器根据页面字符集度HTML页面进行解析, 推荐大家在HttpResponse的时候进行设置
其次才是直接在HTML文档中进行设置:
5. 定义程序编码
语法格式: # -*- coding:utf-8 -*-
编码声明只能在在程序的第一行或第二行,以上只是习惯写法,也推荐大家这么写。 Python内部通过正则表达式"coding[:=]/s*([-/w.]+)"来获取程序编码
编码信息被Python语法分析器用来解释程序源代码文件) 在没有明确指定的情况下, 它使用系统默认的codec对源码文件进行转换
允许非ASCII编码的字符串和注释行, 在没有什么编码格式的情况下,Python内部将它当作iso-8859-1格式进行转换对于 Unix/Linux系统来说,系统的默认codec是ascii, 所以如果程序中包含非ascii字符,请定义好代码格式。