python中的编码问题 1
问题
在平时工作中,遇到了这样的错误:
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相关推荐
- python安全编码问题_浅谈Python中的编码问题
对于Python的初学者来说,编码问题相当令人头疼.本文就根据我在学习过程中遇到的问题简单谈一下Python中的编码.首先简单介绍一下几种常见的编码. 一.几种常见的字符编码 ASCII码 ASCII ...
- 浅谈Python中的编码规则
注:本人用Python3.4作为学习版本,以下学习心得只适用于Python3.4. 之前拜读了金角大王Alex关于编码的解答,收获颇多.特此致谢,以下仅谈一谈作为一个初学者,对编码的理解. 我所了解的 ...
- python编码解码单词_在使用w2v时python中的编码问题
我正在使用word2vec模型在python中编写我的第一个应用程序. 这里是我的简单的代码在使用w2v时python中的编码问题 import gensim, logging import sys ...
- python中的编码问题
Python 中的编码问题 在python中遇到编码问题主要来自于ASCII和gbk两个方面.win中python为unicode 编码而控制台一般为gbk编码 ASCII 对于ASCII来说,是由于 ...
- python采用的编码是什么意思_深入浅出地,彻彻底底地理解Python中的编码
python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...
- 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...
- 编码以及Python中的编码
编码 不管是哪种语言,在学习的时候,只要涉及到中文,多多少少都会遇到一些编码问题.然而,说实话,作为一个英语水平没有那么专业的中国人,中文是必不可少的.所以,了解编码以及解码就变得非常重要.下面是从各 ...
- 有了这篇文章, Python 中的编码不再是噩梦
有了这篇文章, Python 中的编码不再是噩梦 Python 中编码问题,一直是很多 Python 开发者的噩梦,尽管你是工作多年的 Python 开发者,也肯定会经常遇到令人神烦的编码问题,好不容 ...
- python中字符编码使用_python中字符编码是什么?如何转换字符?
屏幕前我们看到的文字,在计算机中也是这样表示吗?事实上,我们所有的信息电脑是无法直接理解的,同样我们所要表达的信息,计算机也不能看懂.这就需要架起一个理解的桥梁,也就是编码帮助我们相互之间进行翻译.今 ...
- python 编码声明位置,python中的编码声明
python中的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python 相当于写死了 python 路径(是告诉OS执行这个py时,调 ...
最新文章
- Luna的大学读书史(1,Intro)
- C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名...
- 与善淘网一起做慈善商店
- rabbitmq-java api
- CodeReview学习与总结
- mave本地导入mysql的jar包_将本地的jar包引入到maven项目中
- 长江浪花~朵儿朵尔朵
- 网络协议:TCP拥塞控制
- java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)
- 设计模式(14)——原型模式(Prototype)
- Rust: rev()、Vec、其它
- 【疑难杂症】三步解决虚拟机启动失败,提示无法获取VMCI驱动程序的版本的问题
- 论NOIP2015我是如何滚粗的
- WPF 做的时钟表盘 加上天气预报
- win10更新(windows update)后,打印蓝屏解决方法
- 分体式降噪耳机有哪些?高配置分体式降噪耳机排行榜
- 测试用例颗粒度实例列举
- 理解矩阵和特征向量的本质
- 豆瓣电台WP7客户端 开发记录1
- IntelliJ IDEA 默认配置文件夹.IntelliJIdea在C盘,转移到其他盘符
热门文章
- 双步位移求解特征值matlab,数值分析——带双步位移的QR分解求特征值算法
- php编写一个计算相对路径的函数,php求相对路径的函数
- android.cat 镜像,Android开发利器之pidcat安装方式
- birt java api_「Birt」birt api生成报表 | 学步园
- 右手残疾学计算机学什么专业好,我是右手和右脚残疾 左手和左脚好的 可以学残疾人驾照吗...
- cvc 降噪_哪款蓝牙耳机降噪效果最好,降噪音质俱佳的蓝牙耳机推荐
- winpcap 目的ip 是0_IP基础
- Windows 10 开启 Num Lock
- pageoffice提示网络连接意外错误
- combobox总结