• 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/

  • 相关阅读:
    变量的解构赋值
    vue-progressbar 知识点
    <script>标签里的defer和async属性 区别(待补充)
    管理node.js版本的模块:n
    node 知识点
    让node支持es模块化(export、import)的方法
    jvm 知识点
    前端 术语
    js的严格模式
    commonJS、AMD、es模块化 区别(表格比较)
  • 原文地址:https://www.cnblogs.com/2012harry/p/2837721.html
Copyright © 2020-2023  润新知