精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-07
最后修改:2010-09-07
#! /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 编码)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 4657 次