python字符编码(python2.6)

很懒,很久之前就写好的。一直没有贴上来。

 

今天发一下,稍后在详细说一下几种编码在内存情况

问题:

    多系统不同平台间数据交互,系统的编码格式不同,一般情况如Windows的gb2312,svn的utf-8,以及可能的mysql的gbk默认编码。在三者间相互数据交互,需要字符转码。调用python中String模块的Decode和Encode解码和编码,下面将介绍python字符转换和我们在项目中遇到的实际问题

Python编码解码:

  1. 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只是中间编码,不是存储编码

 

  1. 字符转换函数使用

解码:

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中已经废弃)

 

  1. 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. 小结

注意:

1)如果在插入数据库有特殊字符,可以使用python的第三方库mysqldb,MySQLdb.escape_string(str)自动转义str中所有的特殊字符;

2)默认情况,Python的函数入口编码大部分都是unicode的,一般我们传入的是str,如果参数都是英文没有问题,python自动将str解码成unicode;如果有中文,需要我们将str解码成unicode;

         3)多系统,跨平台的项目,在设计初期就要充分考虑编码的问题,统一种编码。统一数据交互编码,统一数据库编码。

 

  1. 参考资料

1)  http://blog.csdn.net/zbyufei/article/details/5856730

2)  http://www.python.org/

posted @ 2014-09-12 14:41  2012harry  阅读(583)  评论(0编辑  收藏  举报