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 (显示:命令行中默认编码 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 中的运行结果: 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 编码中有值 100002 进制的形式),但是 b 编码的取值范围不包括 10000 ,就会出现转换错误)

2, 如果变量直接声明为 Unicode 字符,那么在不同输出环境时, python 都能正常地转换为相应的字符串

3, 通过 u 符号声明的 Unicode 字符串在上述 3 种情况下都不出现乱码, 推荐使用

4, 原始字符串和普通字符串声明的字符串的默认编码跟系统环境相关, python 命令行中默认的是操作系统的编码如 windowsgbkpydev 或者 idle 中,字符串的默认编码跟文件头部声明的编码一致(如果文件头部没有声明,那么默认的是 ascii 编码)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值