设为首页 收藏本站
查看: 802|回复: 0

[经验分享] Python 编码

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-11-30 11:45:16 | 显示全部楼层 |阅读模式
Python 编码
  

  ASCII、Unicode、UTF-8 以及 gbk
  在具体说明 Python 编码之前,先来理清 ASCII、Unicode、UTF-8、gbk 究竟是什么? 这边仅简单介绍下,具体请百度。
  ASCII:是现今最通用的单字节编码系统。ASCII(仅1~127) 仅可代表英文、数字及一些符号等,如,A 的 ASCII 码为65(十进制)。
  Unicode:为了解决传统的字符编码方案的局限而产生,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。犹如其本身的英文含义,Unicode是一种所有符号的编码。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
  UTF-8:是一种针对Unicode的可变长度字符编码,它是Unicode实现的方式之一,是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间,参考如下:

  gbk:GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码。



  Python3  支持 Unicode
  从 Python 3.0 开始所有的字符串都支持 Unicode,默认保存为UTF-8格式;故无须特殊处理,即可正常 print 中文

  但 Python3 无 sys.setdefaultencoding()这个函数,故原 Python2 的扩展包要适应这种情况来改写。
  

  Python2 处理 Unicode
  Python2 默认源代码文件是 ASCII 编码,故仅仅使用英文、数字的情况下一切正常,但是若使用了中文等,会报错,如下:

  为了解决此问题,需要保存为 UTF-8 格式,通常会在 .py 文件头上加上  # -*- coding: utf-8 -*-  ,这样,python就会依照utf-8的编码形式解读其中的字符,加上后运行,如下:

  这边,直接 print 中文字符串显示为乱码,这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。
  对此,Python2用来存储文本数据的类型为Unicode 对象,它可以用于存储和维护 Unicode 数据,与现有的字符串对象有良好的集成,必要时提供自动转换。在 Python 中创建 Unicode 字符串和创建普通的字符串一样简单,只需在字符串引号前加 u 即可,如上例中的  u"中文" 。这样处理之后,print 出的中文就不会乱码了。
  在Python 3.x版本中,把'xxx'和u'xxx'统一成Unicode编码,即写不写前缀u都是一样的
  

  sys.setdefaultencoding()
  Python2,可通过 sys.setdefaultencoding('utf8') 来设置默认encoding方式,注意,一定要增加 reload(sys),原因参考下方引用。



1 #!/usr/bin/env python   
2 #encoding: utf-8  
3 import sys       #引用sys模块进来,并不是进行sys的第一次加载  
4 reload(sys)      #重新加载sys  
5 sys.setdefaultencoding('utf8')  #调用setdefaultencoding函数
  那么为什么要重新加载,而直接引用过来则不能调用该函数呢?因为setdefaultencoding函数在被系统调用后被删除了,所以通过 import引用进来时其实已经没有了,所以必须reload一次sys模块,这样setdefaultencoding才会为可用,才能在代码里修改解释器当前的字符编码。
  在python安装目录的Lib文件夹下,有一个叫site.py的文件,在里面可以找到main() --> setencoding()-->sys.setdefaultencoding(encoding),因为这个site.py每次启动 python解释器时会自动加载,所以main函数每次都会被执行,setdefaultencoding函数一出来就已经被删除了。

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145332-1-1.html 上篇帖子: Python:字符编码详解 下篇帖子: Read Large Files in Python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表