很懒,很久之前就写好的。一直没有贴上来。
今天发一下,稍后在详细说一下几种编码在内存情况
问题:
多系统不同平台间数据交互,系统的编码格式不同,一般情况如Windows的gb2312,svn的utf-8,以及可能的mysql的gbk默认编码。在三者间相互数据交互,需要字符转码。调用python中String模块的Decode和Encode解码和编码,下面将介绍python字符转换和我们在项目中遇到的实际问题
Python编码解码:
- python的两种编码:str和unicode
Python字符串有两种类型,一种是str,一种是unicode类型;其中str字符串中的编码格式很多。 Type(“str”).__name__可以输出字符串类型,但是没有办法输出str的编码格式,python的第三方库chardet 提够了相关的功能,可以判断str的编码格式。
例如: import chardet
chardet.detect(rawdata)
{‘confidence‘: 0.98999999999999999, ‘encoding‘: ‘GB2312‘}
1)str
str的编码格式有gbk,utf8,latin1等等,我们在Decode前要确定str是哪种编码格式。
2)unicode
字符串在Python内部的表示是unicode编码,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码字符串。Python在读文本和写文本时候,都是读写str的字符串,如果是写unicode字符串,python内部会将unicode转换成系统编码再写到文件中,而不是写unicode或者读unicode。切忌,unicode只是中间编码,不是存储编码
- 字符转换函数使用
解码:
Decode:将其他编码的字符串转换成unicode编码
Eg:String.Decode(”gbk”),将“gbk”的String解码成unicode的字符串
(误解:将str转化成gbk的字符串,python的字符串的type没有gbk的类型) Decode返回的是unicode的字符串;ps:” String” is a str instance
编码:
Encode:将unicode编码转换成其他编码的字符串
Eg:String. Encode(“gbk”),将unicode的String编码成str,str是gbk格式编码(误解:将unicode转化成gbk的字符串)
Encode返回str的字符串;ps:”String” is a unicode instance
此外更改代码编码格式和系统编码格式的方法:
1)# -*- coding:gbk -*-指定代码的编码格式:如gbk,utf8等等
2)reload(sys)
sys.setdefaultencoding(‘gbk’)指定系统的默认编码格式 (在2.6中已经废弃)
- json
在项目中,数据入库和web数据的读取,要使用后台提够的接口,服务器端将mysql的结果序列化发送给接口,接口再反序列化数据。无论是数据库还是python的序列化和反序列化都有编码的问题,所以前期数据库的设计要和整个系统一致,否则会有很大编码问题。比如项目编码是gbk,数据交互都转换成gbk进行,那么数据库的编码最好就是gbk的编码。同时使用python中的json库也要指定编码是gbk,这样能减少很多编码转码的问题
Json序列化和反序列化的API
Import json
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
encoding=‘utf-8‘, default=None, **kw)json.loads(records, encoding)
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, **kw):
"""Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
document) to a Python object.
If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
must be specified. Encodings that are not ASCII based (such as UCS-2)
are not allowed and should be decoded to ``unicode`` first.
1)Json.dumps,序列化成字符串(eg:[[‘jimmy’],[‘Helen’]]);这个类型是str,str的默认编码是utf8(可以指定编码)
2)Json.load是将字符串反序列化成一个pyhton的二维数组,数组为:[[u‘jimmy’],[u‘Helen’]]
3)json和python序列化和反序列化的数据结构对应
| JSON | Python |
| object | dict |
| array | list |
| string | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
- 小结
注意:
1)如果在插入数据库有特殊字符,可以使用python的第三方库mysqldb,MySQLdb.escape_string(str)自动转义str中所有的特殊字符;
2)默认情况,Python的函数入口编码大部分都是unicode的,一般我们传入的是str,如果参数都是英文没有问题,python自动将str解码成unicode;如果有中文,需要我们将str解码成unicode;
3)多系统,跨平台的项目,在设计初期就要充分考虑编码的问题,统一种编码。统一数据交互编码,统一数据库编码。
- 参考资料
1) http://blog.csdn.net/zbyufei/article/details/5856730