#!/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(显示:命令行中默认编码gbk,1个汉字占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中的运行结果:3(utf-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编码中有值10000(2进制的形式),但是b编码的取值范围不包括10000,就会出现转换错误)
2, 如果变量直接声明为Unicode字符,那么在不同输出环境时,python都能正常地转换为相应的字符串
3, 通过u符号声明的Unicode字符串在上述3种情况下都不出现乱码,推荐使用
4, 原始字符串和普通字符串声明的字符串的默认编码跟系统环境相关,python命令行中默认的是操作系统的编码如windows的gbk,pydev或者idle中,字符串的默认编码跟文件头部声明的编码一致(如果文件头部没有声明,那么默认的是ascii编码)
|