问题

在平时工作中,遇到了这样的错误:

UnicodeDecodeError: 'ascii' codec can't decode byte

想必大家也都碰到过,很常见 。于是决定对python的编码做一个整理和学习。

基础知识

在python2.x中,有两种数据类型,unicode和str,这两个都是basestring的子类

>>> a = '中'
>>> type(a)
<type 'str'>
>>> isinstance(a,basestring)
True
>>> a = u'中'
>>> type(a)
<type 'unicode'>
>>> isinstance(a,basestring)
True

两者的区别,概括来讲,str是字节串,由unicode经过编码(encode)后的字节组成的(好比与python3.x的byte);unicode是对象,才是真正意义上的字符串,由字符组成

>>> a='中文'
>>> len(a)
6
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b=u'中文'
>>> len(b)
2
>>> repr(b)
"u'\\u4e2d\\u6587'"

控制台和脚本

在linux下的python控制台执行以下命令,所得的结果和执行脚本是不同的

>>> a = u'中文'
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b = unicode('中文','utf-8')b)
>>> repr(b)
"u'\\u4e2d\\u6587'"

可以看到,u'中文'初始化的对象a不是我们所期望的,那究竟是什么原因呢?
将python看成是一根管子,管子里头处理的中间过程都是使用unicode的。入口处,全部转成unicode;出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况)。
在控制台执行命令a = u'中文',可以将解释为命令,a = ‘中文’.decode(encode),从而到到unicode对象a。那么这里的encode是什么呢?对于控制台来说,就是标准输入,即sys.stdin.encoding

>>> sys.stdin.encoding
'ISO-8859-1'

我的这边控制台默认的编码是ISO-8859-1,故a = u'中文' <=> a = '中文'.decode('ISO-8859-1')
这里的'中文'是控制台理解的,即使根据终端编码方式编码后的字节码,对于utf-8编码的终端,'中文'='\xe4\xb8\xad\xe6\x96\x87'

>>> a='中文'.decode('ISO-8859-1')
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"

那如何修改此编码值呢,设置为什么呢?在linux环境中设置环境变量方法如下,具体设置什么只要与终端编码方式一直即可

export PYTHONIOENCODING=UTF-8

总结

重新回到最初的那个问题,造成问题的原因是没有搞清楚unicode和str的区别,将两者进行了混用。

>>> a = '中文'
>>> a.encode('gbk')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

以上的对象a其实是str,即字节码,若终端是utf-8编码的话,那么a就是用utf-8 encode的字节码。a.encode('gbk') 等价于a.decode(encoding).encode('gbk'),即先将字节码解码为unicode字符,然后再encode为字节码。unicode对象作为中转站。那么这里的encoding是什么呢?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

默认是ascii,这正是错误为什么报无法用ascii解码的原因

>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> a = '中文'
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> a.encode('gbk')
'\xd6\xd0\xce\xc4'

将默认编码改为utf-8,即可。不鼓励对str使用encode方法,因为其中隐式对str进行了解码。decode只对str,encode只对unicode,一切decode/encode都显示指定编码方式。

python中的编码问题 1相关推荐

  1. python安全编码问题_浅谈Python中的编码问题

    对于Python的初学者来说,编码问题相当令人头疼.本文就根据我在学习过程中遇到的问题简单谈一下Python中的编码.首先简单介绍一下几种常见的编码. 一.几种常见的字符编码 ASCII码 ASCII ...

  2. 浅谈Python中的编码规则

    注:本人用Python3.4作为学习版本,以下学习心得只适用于Python3.4. 之前拜读了金角大王Alex关于编码的解答,收获颇多.特此致谢,以下仅谈一谈作为一个初学者,对编码的理解. 我所了解的 ...

  3. python编码解码单词_在使用w2v时python中的编码问题

    我正在使用word2vec模型在python中编写我的第一个应用程序. 这里是我的简单的代码在使用w2v时python中的编码问题 import gensim, logging import sys ...

  4. python中的编码问题

    Python 中的编码问题 在python中遇到编码问题主要来自于ASCII和gbk两个方面.win中python为unicode 编码而控制台一般为gbk编码 ASCII 对于ASCII来说,是由于 ...

  5. python采用的编码是什么意思_深入浅出地,彻彻底底地理解Python中的编码

    python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...

  6. 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...

  7. 编码以及Python中的编码

    编码 不管是哪种语言,在学习的时候,只要涉及到中文,多多少少都会遇到一些编码问题.然而,说实话,作为一个英语水平没有那么专业的中国人,中文是必不可少的.所以,了解编码以及解码就变得非常重要.下面是从各 ...

  8. 有了这篇文章, Python 中的编码不再是噩梦

    有了这篇文章, Python 中的编码不再是噩梦 Python 中编码问题,一直是很多 Python 开发者的噩梦,尽管你是工作多年的 Python 开发者,也肯定会经常遇到令人神烦的编码问题,好不容 ...

  9. python中字符编码使用_python中字符编码是什么?如何转换字符?

    屏幕前我们看到的文字,在计算机中也是这样表示吗?事实上,我们所有的信息电脑是无法直接理解的,同样我们所要表达的信息,计算机也不能看懂.这就需要架起一个理解的桥梁,也就是编码帮助我们相互之间进行翻译.今 ...

  10. python 编码声明位置,python中的编码声明

    python中的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python 相当于写死了 python 路径(是告诉OS执行这个py时,调 ...

最新文章

  1. Luna的大学读书史(1,Intro)
  2. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名...
  3. 与善淘网一起做慈善商店
  4. rabbitmq-java api
  5. CodeReview学习与总结
  6. mave本地导入mysql的jar包_将本地的jar包引入到maven项目中
  7. 长江浪花~朵儿朵尔朵
  8. 网络协议:TCP拥塞控制
  9. java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)
  10. 设计模式(14)——原型模式(Prototype)
  11. Rust: rev()、Vec、其它
  12. 【疑难杂症】三步解决虚拟机启动失败,提示无法获取VMCI驱动程序的版本的问题
  13. 论NOIP2015我是如何滚粗的
  14. WPF 做的时钟表盘 加上天气预报
  15. win10更新(windows update)后,打印蓝屏解决方法
  16. 分体式降噪耳机有哪些?高配置分体式降噪耳机排行榜
  17. 测试用例颗粒度实例列举
  18. 理解矩阵和特征向量的本质
  19. 豆瓣电台WP7客户端 开发记录1
  20. IntelliJ IDEA 默认配置文件夹.IntelliJIdea在C盘,转移到其他盘符

热门文章

  1. 双步位移求解特征值matlab,数值分析——带双步位移的QR分解求特征值算法
  2. php编写一个计算相对路径的函数,php求相对路径的函数
  3. android.cat 镜像,Android开发利器之pidcat安装方式
  4. birt java api_「Birt」birt api生成报表 | 学步园
  5. 右手残疾学计算机学什么专业好,我是右手和右脚残疾 左手和左脚好的 可以学残疾人驾照吗...
  6. cvc 降噪_哪款蓝牙耳机降噪效果最好,降噪音质俱佳的蓝牙耳机推荐
  7. winpcap 目的ip 是0_IP基础
  8. Windows 10 开启 Num Lock
  9. pageoffice提示网络连接意外错误
  10. combobox总结