python2.7 编码问题

 

  python 2.7编码问题,着实使人头疼不已,这两天抽闲想真正弄明白。须要弄清楚这个问题,首先须要明白ASCII,Unicode 和 UTF-8之间的关系。python

  进行对上述几种概念进行描述以前,先进行简单的总结:windows

  一、第一个阶段,计算机出现初期,计算机中用8位表示一个字节,共256种状态,用来表示英文、标点、以及其余的一些特殊符号(控制码)等,已经足够了,这种方式被你们成为是ANSI的ASCII编码网络

  二、随着计算机慢慢渗透到其余国家,127种状态已经不能知足需求,好比中文经常使用的字符上万种,中国人民基于ASCII编码对中文进行扩充改造,因而出现了GB2312,但因为汉字实在太多,因此后面又出现了GBK、GB18030python2.7

  三、和咱们国家的状况相似,都有本身的编码系统,若是不安装相应的解码系统,那就只有乱码了编码

  四、ISO这个组织终于看不下去了,因而规定了一种字符集,包括目前世界上全部的字符code

  五、UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。因而就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为何国内还有这么多使用 GBK 等编码的人?由于 UTF-8 等编码体积比较大,占电脑空间比较多,若是面向的使用人群绝大部分都是中国人,用 GBK 等编码也能够。blog

 

 1、ASCII编码utf-8

  计算机内部的全部信息都是由二进制表示,每一位均可以用0和1两种状态表示,8位共能够表示256种状态,8位二进制表示一个字节,则一个字节能够表明256字符,由于英文用128个字符表示已经足够了,则ASCII码只用了128个字符编码,最高位0位,2的7次方恰好为128。unicode

  咱们能够知道ASCII码表示英文没有问题,可是世界上还有其它许多种的字符,ASCII码确定是表示不了这么多的字符,须要其它的编码方式。好比中文经常使用的汉字上数万个,256种的编码方式确定不适合,汉字通常使用GB2312编码。开发

2、ANSI编码

  ANSI能够认为是ASCII的扩展集,表示对应当前系统的locale的遗留编码,根据当前的locale选定具体的编码,好比简体中文就是GBK,繁体就是BIG5,其它的有其它的编码方式,因此ASCII的扩展集,不一样语言地域使用的是不同的,因此各国都有本身的编码规则,相互不能兼容,因此ISO牵头着手解决了这个问题,因而推出了下面的Unicode编码

3、Unicode编码

  由上一节咱们能够知道,如今存在多种编码方式,咱们在解码文件的时候,就必定知道其编码方式,不然解码的时候就会出现乱码。Unicode能够包括100多万的字符,每一种字符都存在惟一的编码,可是须要Unicode是字符集,而并无规定字符的存储方式。Unicode规定每个字符须要用3个字节或者4个字节表示,可是对于英文字符只须要一个字符表示,这种字节的浪费是不能接受的。

4、UTF-8编码

   UTF-8是一种可变长的编码,字节为1~4字节,值得注意的是UTF-8与Unicode的关系是:前者是后者的一种实现方式。

  UTF-8编码有两种规则:

  一、对于单字节,首位BIT为0,这与ASCII保持一致,编码也与ASCII同样,彻底兼容了ASCII编码

  二、对于多字节,好比N个字节,第一个字节前N位为1,第N+1位为0,后续字节的前两位为10,其它所有为字符的Unicode编码。

  由上可知,若是是UTF-8编码,若是首位为0,表示该字符编码占一个字节,若是首位不为0,有几个1,就表示一共占几个字节

  UTF编码在windows平台下,默认带BOM(unicode协议规定的码点),好比你在记事本上编辑的代码,都会带有这个所谓的码头;这样的是不能跨平台处理的;由于Linux/Unix是不会解析这个BOM。因此建议windows开发的同窗,建议使用Notepad++,并使用无BOM方式保存。

  固然还有UTF-1六、UTF-32等编码方式,你会发如今windows平台下,用记事本保存为UNICODE,其码值对应就是UTF-16,可是不能说在windows上unicode就是utf-16,缘由前面已经说了。

4、举个例子

       打开记事本,输入“中”,而后以不一样的编码方式存储。

  

  而后能够用“UE”查看各类编码下的十六进制。

  UTF-8对应的十六进制:EF BB BF E4 B8 AD,前面三个字节为BOM,后面三个字节才是“中”对应的编码,转换为二进制位:111001001011100010101101

  UNICODE对应的十六进制:FF FE 2D 4E,前面两个字节表示大/小端,FF FE表示是小端的存储方式,因此其码值为4E2D,转换为二进制位:100111000101101

  由上面的二进制可知,UTF-8与UNICODE之间的转换,可以知足上述的规则的。

  那么问题来了,GBK或者其余地区的编码如何与UNICODE进行转换呢?---codepage,所谓codepage就是各国的文字编码与UNICODE对应关系的映射表。GBK与UNICODE的codepage为936。

  

4、Python编码问题

  终于进入主题,Python2.7中文编码的时候容易出现乱码。其缘由是你提供字符的编码与默认的编码格式不一致。好比在windows平台(简中)上,cmd中断默认的编码是gdk,你在cmd中窗口中,以gdk解码成unicode是没有问题的,可是要是以utf-8进行解码,是会报错的。

 

若是是在cmd下想采用utf-8的编码怎么办呢?先解码成unicode而后再采用utf-8进行编码,其余的编码转换方式相似,先解码再编码。

 总之,在python2.7版本上,要想不乱码,就须要使文本的编码与平台默认的编码方式一致,这样就不会出现乱码了。 文中部份内容来自网络,若是涉及侵权,请联系我。

相关文章
相关标签/搜索