六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 22|回复: 0

python在pydev,IDLE,命令行出现乱码的原因及解决

[复制链接]

升级  8.33%

65

主题

65

主题

65

主题

举人

Rank: 3Rank: 3

积分
225
 楼主| 发表于 2013-2-7 03:33:28 | 显示全部楼层 |阅读模式
#!/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编码)
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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