设为首页 收藏本站
查看: 870|回复: 0

[经验分享] python在pydev,IDLE,命令行出现乱码的原因及解决

[复制链接]

尚未签到

发表于 2017-5-7 07:27:41 | 显示全部楼层 |阅读模式
#!/usr/bin/env python

# -*-coding: utf-8 -*-

#@authorzcwang3@gmail.com

#@version2010-09-07 11:22

 

#原始字符串

rstr = r"编码"

#普通字符串

str = "编码"

#Unicode字符串

ustr = u"编码"

#utf-8编码把str转换为unicode

utf8ToUnicodeStr=str.decode('utf-8')

粘贴到CMD启动的PYTHON命令行中的运行结果:UnicodeDecodeError(命令行中默认使用的是windows系统的gbk编码,str就是使用gbk编码的字符串,使用utf-8解码时部分字节值超出utf-8范围,系统错误)
#gbk编码把str转换为unicode

gbkToUnicodeStr=str.decode('gbk')

 

rstr

str

ustr

utf8ToUnicodeStr

gbkToUnicodeStr

print len(rstr)

pydev中的运行结果:6(显示:文件头部声明的utf-8编码起作用,并且1个汉字占3位)
IDLE中的运行结果:6(显示:文件头部声明的utf-8编码起作用,并且1个汉字占3位)
粘贴到CMD启动的PYTHON命令行中的运行结果:4(显示:命令行中默认编码gbk1个汉字占3
print len(str)

pydev中的运行结果:6
IDLE中的运行结果:6
粘贴到CMD启动的PYTHON命令行中的运行结果:4
原始字符串和普通字符串有相同的结果
print len(ustr)

pydev中的运行结果:2
IDLE中的运行结果:2
粘贴到CMD启动的PYTHON命令行中的运行结果:2
通过使用u来标志的unicode字符在3种情况下结果一致,1个汉字占2
print len(utf8ToUnicodeStr)

pydev中的运行结果:2(通过正确的编码,转换成相应的unicode字符串)
IDLE中的运行结果:2(通过正确的编码,转换成相应的unicode字符串)
粘贴到CMD启动的PYTHON命令行中的运行结果:变量未定义
print len(gbkToUnicodeStr)

pydev中的运行结果:3utf-8声明的字符串,用gbk解码,结果是乱码)
IDLE中的运行结果:3
粘贴到CMD启动的PYTHON命令行中的运行结果:2
 
print rstr

print str

print ustr

print utf8ToUnicodeStr

printgbkToUnicodeStr
 
IDLE中的运行结果和通过python + py文件的运行结果完全一致!
 
Pydev中模块的默认编码在文件头声明(没有声明就是ascii),控制台显示的默认编码和文件头声明的编码一致
IDLE中调用时模块的默认编码在文件头声明(没有声明就是ascii),控制台显示的默认编码和操作系统默认编码一致(如中文windows下的gbk一致
粘贴到CMD启动的PYTHON命令行中,直接声明的字符串的默认编码和命令行中显示的默认编码都是操作系统默认编码一致(如中文windows下的gbk
 
结论:
1, 乱码,编码错误出现的原因:字符串str声明时编码为a,而输出(控制台显示或者写入文件,数据库等)时由于环境的不同,默认编码也不同。在不同的环境下,python会根据各自的默认编码去解码字符串a因此出现乱码(str对应的a编码的值正好都在b编码的取值范围内)或者编码错误(譬如:a编码中有值100002进制的形式),但是b编码的取值范围不包括10000,就会出现转换错误)
2, 如果变量直接声明为Unicode字符,那么在不同输出环境时,python都能正常地转换为相应的字符串
3, 通过u符号声明的Unicode字符串在上述3种情况下都不出现乱码,推荐使用
4, 原始字符串和普通字符串声明的字符串的默认编码跟系统环境相关,python命令行中默认的是操作系统的编码如windowsgbkpydev或者idle中,字符串的默认编码跟文件头部声明的编码一致(如果文件头部没有声明,那么默认的是ascii编码)
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373976-1-1.html 上篇帖子: python 中編碼方式的學習體驗<一> 下篇帖子: Python实例讲解 -- 操作数据库 附mysqldb win32 py2.7下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表