zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    hihoCoder week20 线段树的区间修改
    hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询
    hihoCoder week17 最近公共祖先·三 lca st表
    hihoCoder week16 RMQ-ST算法
    hihoCoder week15 最近公共祖先·二
    eclipse 分屏显示同一文件
    eclipse 每次以debug方式启动springboot之后都会在SilentExitExceptionHandler类中的throw new SilentExitException()处断开,但是我明明没有下断点啊
    eclipse alt+/智能提示错误问题
    SpringBoot 之 普通类获取Spring容器中的bean
    kafka常用命令
  • 原文地址:https://www.cnblogs.com/2012harry/p/2837721.html
Copyright © 2011-2022 走看看