python 2.7编码问题
问题引入
先看下面的代码,代码用utf8编码格式保存.
print("中")
仅有一行代码,但是这个代码无论在ubuntu下还是win7下都会报错,错误信息类似是下面的内容:
SyntaxError: Non-ASCII character '\xe4' in file xxx, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
错误的原因是python 2.7默认python代码中只有ASCII编码.而代码中有"中"这个汉字.python解释器处理到汉字时,发现ASCII码没办法表示,就报错了.修改如下:
# coding:utf-8
print("中")
加上# coding:utf-8意思是告诉python解释器,源代码的编码是utf-8,python解释器就用utf-8的形式处理源代码,utf-8可以表示"中"这个汉字.再在命令行窗口中运行代码,虽然不报错,且Ubuntu下显示正常,但是在windows命令行窗口中显示显示的不是汉字"中".为什么?这个涉及到的问题比较多,分步骤讨论.
str,unicode
str是字节组成的序列.需要强调的是,str必须显示或隐式地指定字符编码的时候,str和字符才能对应起来.同一个str,字符编码不同时,显示的内容就不同.这个非常容易理解,对于2个字节组成的str,utf-8和gbk代表的字符肯定是不一样的.python字符串默认是str型.之前的print("中")实际上输出的是str类型的字符串.看下面的代码.
# coding:utf-8
a = "中"
print(type(a))
print(len(a))
上面代码输出是str, 长度为3. str表示"中"是str类型,长度为3表示"中"由3个字节组成.内存中是以utf-8保存字符串的,"中"的utf-8编码是3个字节,所以len的输出为3.
再看下面代码
# coding:utf-8
a = u"中"
print(type(a))
print(len(a))
"中"之前加一个前缀u,声明这里的"中"是unicode类型.unicode类型的字符串有几个字符,长度就是几,可以直观地看出来,不用再纠结字符在内存中是几个字节.这样就大大减轻了程序员的思维负担.
print函数自动转码问题
写程序时经常会用print函数测试输出,这就涉及到输出内容的编码.看下面代码
# coding:utf-8
import sys
print (sys.stdout.encoding)
这个代码在windows下输出是cp936,Ubuntu下输出是utf-8. 参数是str类型或者unicode类型,print函数会做不同处理,分开讨论.
str
输入参数是str类型时,print函数会把str转成sys.stdout.encoding指定的编码输出.对于汉字"中",python解释器把汉字"中"转化成utf-8(源代码的coding:utf-8指定)编码,占3个字节,类型为str.调用print函数时,python解释器把这3个字节当成sys.stdout.encoding指定的编码输出.Ubuntu系统中sys.stdout.encoding为utf-8,,肯定正常,因为本身是按utf-8形式转成3个字节的,再以utf-8显示,没问题.Windows系统中,sys.stdout.encoding是cp936,本身那3个字节是表示一个utf-8编码,现在以cp936的形式输出,就得到一个奇怪结果.这就解释了第1部分中的问题.如果字节中有超出cp936编码的内容,会直接报错.
unicode
unicode就比较简单了,不存在转码的问题.输入的unicode编码是什么,就输出对应的字符.
解决问题
要想让在windows系统下正常显示"中",转下码就可以了.代码如下.
import sys
a = "中"
print a.decode("utf-8").encode(sys.stdout.encoding)
先转成unicode,再转成sys.stdout.encoding编码.可以unicode当成"中转站",任何编码都能转成unicode,unicode也能转成任何编码.这个思路在处理不同操作系统的路径问题时非常有用.
注意
- python 2中程序运行过程中应该使用unicode,最后返回结果时再根据需要转成utf-8或gbk.不要使用setdefaultencoding('utf-8'),原因见参考资料.
- 凡是和输出有关的最好都转化成sys.getfilesystemencoding()编码再输出.
参考资料
- Why does Python print unicode characters when the default encoding is ASCII?
- unicode编码列表
- GBK 编码
- 立即停止使用 setdefaultencoding('utf-8')以及为什么
python 2.7编码问题的更多相关文章
- python基础之编码问题
python基础之编码问题 本节内容 字符串编码问题由来 字符串编码解决方案 1.字符串编码问题由来 由于字符串编码是从ascii--->unicode--->utf-8(utf-16和u ...
- Python基础-字符编码与转码
***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...
- python中的编码问题:以ascii和unicode为主线
1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8 ...
- python与字符集编码
讲的比较明白的博客:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 以上面博文的汉为例子,汉字的GBK编码是baba, UNIC ...
- 第三篇:python基础之编码问题
python基础之编码问题 python基础之编码问题 本节内容 字符串编码问题由来 字符串编码解决方案 1.字符串编码问题由来 由于字符串编码是从ascii--->unicode---&g ...
- Python的字符编码
Python的字符编码 1. Python字符编码简介 1. 1 ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...
- python中的编码与解码
编码与解码 首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显 ...
- Python常用字符编码(转)
Python常用字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...
- Python常见字符编码间的转换
主要内容: 1.Unicode 和 UTF-8的爱恨纠葛 2.字符在硬盘上的存储 3.编码的转换 4.验证编码是否转换正确 5.Python bytes类型 前 ...
- python 3字符编码
python 3字符编码 官方链接:http://legacy.python.org/dev/peps/pep-0263/ 在Python2中默认是ascii编码,Python3是utf-8编码 在p ...
随机推荐
- nyoj 44-子串和(子串和最大问题)
44-子串和 内存限制:64MB 时间限制:5000ms Special Judge: No accepted:12 submit:48 题目描述: 给定一整型数列{a1,a2...,an},找出连续 ...
- 【集合系列】- 深入浅出的分析TreeMap
一.摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap.LinkedHashMap.TreeMap.IdentityHashMap.WeakHashMap.Hashtable.Pro ...
- 认证域名与SSL证书的区别
一.认证域名与SSL证书的区别 SSL 证书使访问者的 Web 浏览器和网站的服务器之间的安全. 加密连接,并确保交易的安全从篡改和拦截.认证域名向网站访客的注册和控制该网站的域名已验证.认证域名并不 ...
- 胜利点组——“萌猿填词”微信小程序评价
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860 1.根据(不限于)NABCD评论作品的选题; (1).你的创意解决了 ...
- python3 之 面向对象(类)、继承、派生和多态
类提供了一种 组合数据和功能 的方法.创建一个新类意味着:创建一个新 类型 的对象,从而允许创建一个该类型的新 实例. 每个类的实例可以拥有: 保存自己状态的属性. 一个类的实例也可以有改变自己状态 ...
- 解决failed to push some refs to 'git@github.com:TQBX/GIT-Github-.git'问题
解决以下问题问题: git pull origin master --allow-unrelated-histories 进入vim界面->ESC->:wq 重复第一步->git p ...
- vue 做一个简单的TodoList
目录结构 index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- scikit-learn网格搜索来进行高效的参数调优
内容概要¶ 如何使用K折交叉验证来搜索最优调节参数 如何让搜索参数的流程更加高效 如何一次性的搜索多个调节参数 在进行真正的预测之前,如何对调节参数进行处理 如何削减该过程的计算代价 1. K折交叉验 ...
- MySQL(学生表、教师表、课程表、成绩表)多表查询
1.表架构 student(sid,sname,sage,ssex) 学生表 course(cid,cname,tid) 课程表 sC(sid,cid,score) 成绩表 teacher(tid,t ...
- Linux的awk命令详解
awkawk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再 ...