作家
登录

不想再被鄙视?那就看进来! 一文搞懂Python 2字符编码

作者: 来源: 2017-12-18 16:59:26 阅读 我要评论

unicode每种说话中的每个字符设定了同一并且独一的二进制编码,以知足跨说话、跨平台进行文本转换、处理的请求。unicode编码必定以u开首。

然则,unicode只是一个编码规范,是所有字符对应二进制的集合,而不是具体的编码规矩。或者说,unicode是表示情势,而不是存储情势,就是说没用定义每个字符是若何故二进制的情势存储的。这个就跟GBK这些不一样,GBK是表里如下,表示情势即存储情势。

比如汉字“严”的unicode编码是u4e25,对应的二进制是1001110 00100101,然则当其经由收集传输或者文件存储时,是没法知道怎么解析这些二进制的,轻易和其他字节混在一路。那么怎么存储unicode呢,于是出现了UTF(UCS Transfer Format),这个是具体的编码规矩,即UTF的表示情势与存储格局是一样的。

是以,可以说,GBK和UTF-8是同一个层面的器械,跟unicode是另一个层面的器械,unicode飘在空中,如不雅要落地,须要转换成utf-8或者GBK。只不过,转换成Utf-8,大年夜家都能懂,更懂用,而转换成GBK,只有中国人才看得懂

UTF也有不合的实现,如UTF-8, UTF-16, 这里以UTF-8为例进行讲解(下面一末节引用了阮一峰的文┞仿)。

在上上末节,提到了utf-8编码的str,与gbk编码的str,感到有点绕。我们知道,一个汉字‘严’,可存储的编码格局可所以gbk(’xd1xcf’),也可所以utf-8(’xe4xb8xa5’),那么当我们在终端敲入这个汉字的时刻,是哪一种格局呢?取决于终端默认编码。

unicode与utf-8

UTF-8最大年夜的一个特点,就是它是一种变长的编码方法。它可以应用1~4个字节表示一个符号,根据不合的符号而变更字节长度。UTF-8的编码规矩很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。是以对于英语字母,UTF-8编码和ASCII码是雷同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有说起的二进制位,全部为这个符号的unicode码。

下表总结了编码规矩,字母x表示可用编码的位。

  1. Unicode符号范围      |        UTF-8编码方法 
  2. (十六进制)           |        (二进制) 
  3. ----------------------+--------------------------------------------- 
  4. 0000 0000-0000 007F | 0xxxxxxx 
  5. 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 
  6. 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 
  7. 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

以汉字“严”为例,演示若何实现UTF-8编码。

当编解码赶上Python2.x

下面应用Python说话来验证膳绫擎的理论。在这一章节中,当提到unicode,一般是指unicode type,即Python中的类型;也会提到unicode编码、unicode函数,请大年夜家留意差别。

别的,对于编码,也有两种意思。第一个是名字,指的是字符的二进制表示,如unicode编码、gbk编码。第二个是动词,指的是大年夜字符到二进制的映射过程。不过后文中,编码作为动词,狭义懂得为大年夜unicode类型转换成str类型的过程,解码则是相反的过程。别的强调的是,unicode类型必定是unicode编码,而str类许可能是gbk、ascii或者utf-8编码。

unicode 与 str 差别

在python2.7中,有两种“字符串”类型,分别是str 与 unicode,他们有同一个基类basestring。str是plain string,其实应当称之为字节串,因为是每一个字节换一个单位长度。而unicode就是unicode string,这才是真正的字符串,一个字符(可能多个字节)算一个单位长度。

python2.7中,unicode类型须要在文本之间加u表示。

  1. >>> us = u'严' 
  2.  
  3. >>> print type(us), len(us) 
  4.  
  5. <type 'unicode'> 1 
  6.  
  7. >>> s = '严' 
  8.  
  9. >>> print type(s), len(s) 
  10.  
  11. <type 'str'> 2 
  12.  
  13. >>> 

大年夜上可以看到,第一,us、s的类型是不一样的;其二,同一个汉字,不合的类型其长度也是不一样的,对于unicode类型的实例,其长度必定是字符的个数,而对于str类型的实例,其长度是字符对应的字节数量。这里强调一下,s(s = ‘严’)的长度在不合的情况下是不一样的!后文会解释

__str__ __repr__的差别

这是python中两个magic method,很轻易让新手含混,因为很多时刻,二者的实现是一样的,然则这两个函数是用在不合的处所


  推荐阅读

  能拍照,还能视频通话?coolpad Dynobot儿童智能手表让你惊艳

市面上的绝大部分儿童手表都不能拍照,最大卖点的只是语音通话功能。Dynobot是市面上仅有的配备两个摄像头的儿童手表,支持480P视频通话。表盘30万像素满足孩子自拍需求,顶部200万像素摄像头可以拍孩子看到的任何画>>>详细阅读


本文标题:不想再被鄙视?那就看进来! 一文搞懂Python 2字符编码

地址:http://www.17bianji.com/lsqh/39888.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)