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

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

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

  2、随着计算机慢慢渗透到其他国家,127种状态已经不能满足需求,比如中文常用的字符上万种,中国人民基于ASCII编码对中文进行扩充改造,于是出现了GB2312,但由于汉字实在太多,所以后面又出现了GBK、GB18030

  3、和我们国家的情况类似,都有自己的编码系统,如果不安装相应的解码系统,那就只有乱码了

  4、ISO这个组织终于看不下去了,于是规定了一种字符集,包括目前世界上所有的字符

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

一、ASCII编码

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

  我们可以知道ASCII码表示英文没有问题,但是世界上还有其它许多种的字符,ASCII码肯定是表示不了这么多的字符,需要其它的编码方式。比如中文常用的汉字上数万个,256种的编码方式肯定不适合,汉字一般使用GB2312编码。

二、ANSI编码

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

三、Unicode编码

  由上一节我们可以知道,现在存在多种编码方式,我们在解码文件的时候,就一定知道其编码方式,否则解码的时候就会出现乱码。Unicode可以包括100多万的字符,每一种字符都存在唯一的编码,但是需要Unicode是字符集,而并没有规定字符的存储方式。Unicode规定每一个字符需要用3个字节或者4个字节表示,但是对于英文字符只需要一个字符表示,这种字节的浪费是不能接受的。

四、UTF-8编码

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

  UTF-8编码有两种规则:

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

  2、对于多字节,比如N个字节,第一个字节前N位为1,第N+1位为0,后续字节的前两位为10,其它全部为字符的Unicode编码。

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

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

  当然还有UTF-16、UTF-32等编码方式,你会发现在windows平台下,用记事本保存为UNICODE,其码值对应就是UTF-16,但是不能说在windows上unicode就是utf-16,原因前面已经说了。

四、举个例子

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

  

  然后可以用“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。

  

四、Python编码问题

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

如果是在cmd下想采用utf-8的编码怎么办呢?先解码成unicode然后再采用utf-8进行编码,其他的编码转换方式类似,先解码再编码。

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

python2.7 编码问题的更多相关文章

  1. 【Python】python2 str 编码检测

    python2 str 编码检测 import chardet s = 'sdffdfd' print type(s) print chardet.detect(s) s2 = '反反复复' prin ...

  2. 转:Python2字符编码问题汇总

    这篇文章的部分问题在Python3以后不再存在,老猿只是觉得文章的部分内容还是有参考价值,因此在此原文转发连接: Python2字符编码问题汇总

  3. 关于Python2字符编码的体会

    对于Python的字符编码问题也懵了很久,最近做爬虫多次遇到网页转码的问题,干脆彻底解决掉!Just Do it! 1.两种类型str与unicode str和unicode都是basestring的 ...

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

    程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...

  5. python2.x编码问题实例

    1,编码问题,主要是区分面向人类的字符串,面向计算机的字节序列 在python3中,字符串是str(默认即unicode),字节序列是bytes 在python2中,字符串是unicode,字节序列是 ...

  6. python2.X编码

    1.Python文件的编码 在Python文件中,可以在第一或第二行指定文件的编码格式(以注释的形式加),这也是Python语法规定的,见http://www.python.org/peps/pep- ...

  7. Python2字符编码问题汇总

    目录 从字符编码说起 unicode与utf-8 当编解码遇上Python2.x unicode 与 str 区别 __str__ __repr__的区别 unicode str utf-8关系 un ...

  8. Python2中编码错误---重组人表皮生长因子凝胶(易孚格式转化为UTF-8

    在python2的使用中,总会遇到各种各样的编码问题,这也是使用Python2最头疼的一件事情,幸好python3解决了编码的问题. 下面我在爬虫时遇到的类似重组人表皮生长 ...

  9. 从python2,python3编码问题引伸出的通用编码原理解释

    今天使用python2编码时遇到这样一条异常UnicodeDecodeError: ‘ascii’ code can’t decode byte 0xef 发现是编码问题,但是平常在python3中几 ...

  10. python3与python2的编码问题

    在讲这个问题之前,我们先说说unicode的工作原理.unicode包含了跟全球所有国家编码的映射关系,就是不管你用哪个国家的编码,unicode都能找到它在unicode中的编码.那么无论你用什么编 ...

随机推荐

  1. PHP 之CI框架+GatewayWorker+AmazeUI低仿微信聊天网页版

    html5开发的仿微信网页版聊天,采用html5+css3+jquery+websocket+amazeui等技术混合架构开发,实现了微信网页版的主要功能. 一.效果图 二.前端参考代码 <!D ...

  2. vue组件的原理

    https://www.cnblogs.com/landeanfen/p/6518679.html

  3. 【java反射】

    反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个类对象进行操作. A ...

  4. 【Python 脚本报错】AttributeError: 'module 'yyy' has no attribute 'xxx'的解决方法

    先参考这篇记录大概理解了原因, 再深入了解下python的import机制, 发现自己的模块之间存在互相import. 比如,A.py中import B,而B.py中也import A了, 现在执行模 ...

  5. ArcGIS中国工具3.2新功能

    ArcGIS中国工具3.2新功能 1.       增加属性格式刷, 2.       编辑自动保存,每5分钟保存一次

  6. 使用Flask构建机器学习模型API

    1. Python环境设置和Flask基础 使用"Anaconda"创建一个虚拟环境.如果你需要在Python中创建你的工作流程,并将依赖项分离出来,或者共享环境设置," ...

  7. sed替换 - 含反斜杠(/)和Shell变量

    sed替换 - 含反斜杠(/)和Shell变量 摘自: https://blog.csdn.net/zhenyongyuan123/article/details/6616263 2011年07月19 ...

  8. div和span显示在同一行

    div和span标签的区别 div  是块级元素标签,独占一行,后面跟的内容换行显示 span  是内联元素标签,后面可以跟其他显示内容,不独占一行 display属性可以改变内联元素和块级元素的状态 ...

  9. PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  10. (八)UML之状态图

    一.概念 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Act ...