`
desert3
  • 浏览: 2138562 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

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

阅读更多

#! /usr/bin/env python

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

#@author zcwang3@gmail.com

#@version 2010-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

print gbkToUnicodeStr

 

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 编码)

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics