• python 2.x的编码问题


    我发现很多刚刚接触Python的同行在python版本的选择上比较头疼,python3是未来的确是毋庸置疑,但是现实是缺乏很多强大的第三方库;2.x系列呢,又有很多人纠结编码问题,其实到了2.7的年代,python在编码以及平滑向3过渡的问题已经做了大量工作了。

    我就基于python 2.7简单说说编码的事情,让更多人可以完全不用担心python的编码问题,放心大胆的使用当前的主流版本,并且将来还可以轻松过渡到python 3.x。

    ----------------------

    首先,讲讲str和unicode这两个对象。

    str:其底层存储的字节跟输入有关,如果终端输入的是gbk编码的'中国',那么str里面保存的字节序列是'\xd6\xd0\xb9\xfa',如果输入编码是utf8,那么字节序列为'\xe4\xb8\xad\xe5\x9b\xbd'。而如果在终端用gbk编码显示字节序列为utf8编码的'中国',当然会乱码了。所以要搞定这种问题,首先要知道str里面的字节序列是什么编码的,找输入的源头吧。

    unicode:其与str不同在只要你能正确生成unicode对象,那么此对象保存的东西永远是unicode编码,跟输入时的编码无关,你也不用知道其底层使用的是什么字节序列,只需要知道取出来的时候是unicode对象,要转成其他编码的字节序列的话encode一下就行了,例如,我有一个保存着"中国"二字的u,你要输出到gbk终端,那么可以u.encode('gbk'),这样就生成了一个gbk编码的字节序列。

    仅此而已,搞清编码问题就是这么简单。

    然后,来说说实际操作。

    因为未来的python是全unicode的,所以在2.7中我们也最好把所有输入的字符串都生成为unicode对象,然后再进行各种操作。为了省事,以及完全忽略str和unicode的不同,可以在代码开始之前加上这句

    from __future__ import unicode_literals

    (想知道__future__是什么东西,可以自己看看python v2.7.2 doc的27.11节)

    加上这句之后,'中国'和u'中国'一样,都是生成了unicode对象,在这种情况下,除非接收第三方库的输入或者使用str(),基本很难见到非unicode的字符串了。如此,你就不用再分心字符串到底是哪种对象的问题了,也不用写满篇的u'xxx'。

    需要注意的就是,在使用某些诡异的较古老的第三方库,尤其是基于C的库时,注意要把unicode对象转成适当编码的str对象,因为这些库对特定编码的字节序列有依赖。

    实际上,我本人的python代码都会在头部写上

    from __future__ import print_function, unicode_literals, division 
    from future_builtins import *

    如此写出来的代码,跟python 3基本没什么区别,到时候过渡过去非常轻松。

    希望大家在python生涯中轻松愉快。

  • 相关阅读:
    Hbase 统计行数的四种方式
    Solr、MongoDB和Hadoop比较
    三种方法更改MAC OS X下的HOSTS文件
    史上最全前端面试题(含答案)
    图文-水平垂直居中兼容ie6+
    CSS3动画
    jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com)
    web app变革之rem
    MAC中通过gem命令安装compass
    mac下升级ruby环境版本
  • 原文地址:https://www.cnblogs.com/inside/p/2272047.html
Copyright © 2020-2023  润新知