免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4208 | 回复: 0
打印 上一主题 下一主题

python在pydev,IDLE,命令行出现乱码的原因及解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-10 14:00 |只看该作者 |倒序浏览
  1. #! /usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. #@author zcwang3@gmail.com

  4. #@version 2010-09-07 11:22

  5.   

  6. # 原始字符串

  7. rstr = r " 编码 "

  8. # 普通字符串

  9. str = " 编码 "

  10. #Unicode 字符串

  11. ustr = u " 编码 "

  12. # 用 utf-8 编码把 str 转换为 unicode

  13. utf8ToUnicodeStr=str.decode( 'utf-8' )

  14. 粘贴到 CMD 启动的 PYTHON 命令行中的运行结果: UnicodeDecodeError( 命令行中默认使用的是 windows 系统的 gbk 编码, str 就是使用 gbk 编码的字符串,使用 utf-8 解码时部分字节值超出 utf-8 范围,系统错误 )

  15. # 用 gbk 编码把 str 转换为 unicode

  16. gbkToUnicodeStr=str.decode( 'gbk' )

  17.   

  18. rstr

  19. str

  20. ustr

  21. utf8ToUnicodeStr

  22. gbkToUnicodeStr

  23. print len(rstr)

  24. 在 pydev 中的运行结果: 6 (显示:文件头部声明的 utf-8 编码起作用,并且 1 个汉字占 3 位)

  25. 在 IDLE 中的运行结果: 6 (显示:文件头部声明的 utf-8 编码起作用,并且 1 个汉字占 3 位)

  26. 粘贴到 CMD 启动的 PYTHON 命令行中的运行结果: 4 (显示:命令行中默认编码 gbk , 1 个汉字占 3 位 )

  27. print len(str)

  28. 在 pydev 中的运行结果: 6

  29. 在 IDLE 中的运行结果: 6

  30. 粘贴到 CMD 启动的 PYTHON 命令行中的运行结果: 4

  31. 原始字符串和普通字符串有相同的结果

  32. print len(ustr)

  33. 在 pydev 中的运行结果: 2

  34. 在 IDLE 中的运行结果: 2

  35. 粘贴到 CMD 启动的 PYTHON 命令行中的运行结果: 2

  36. 通过使用 u 来标志的 unicode 字符在 3 种情况下结果一致, 1 个汉字占 2 位

  37. print len(utf8ToUnicodeStr)

  38. 在 pydev 中的运行结果: 2 (通过正确的编码,转换成相应的 unicode 字符串)

  39. 在 IDLE 中的运行结果: 2 (通过正确的编码,转换成相应的 unicode 字符串)

  40. 粘贴到 CMD 启动的 PYTHON 命令行中的运行结果:变量未定义

  41. print len(gbkToUnicodeStr)

  42. 在 pydev 中的运行结果: 3 ( utf-8 声明的字符串,用 gbk 解码,结果是乱码)

  43. 在 IDLE 中的运行结果: 3

  44. 粘贴到 CMD 启动的 PYTHON 命令行中的运行结果: 2

  45.   

  46. print rstr

  47. print str

  48. print ustr

  49. print utf8ToUnicodeStr

  50. print gbkToUnicodeStr

  51.   

  52. 在 IDLE 中的运行结果和通过 python + py 文件的运行结果完全一致!

  53.   

  54. Pydev 中模块的默认编码在文件头声明(没有声明就是 ascii ),控制台显示的默认编码和 文件头声明的编码 一致

  55. IDLE 中调用时模块的默认编码在文件头声明(没有声明就是 ascii ),控制台显示的默认编码和 操作系统默认编码一致(如中文 windows 下的 gbk ) 一致

  56. 粘贴到 CMD 启动的 PYTHON 命令行中,直接声明的字符串的默认编码和命令行中显示的默认编码都是 操作系统默认编码一致(如中文 windows 下的 gbk )

  57.   

  58. 结论:

  59. 1, 乱码,编码错误出现的原因:字符串 str 声明时编码为 a ,而输出(控制台显示或者写入文件,数据库等)时由于环境的不同,默认编码也不同。在不同的环境下, python 会根据各自的默认编码去解码字符串 a ,因此 出现乱码( str 对应的 a 编码的值正好都在 b 编码的取值范围内) 或者 编码错误(譬如: a 编码中有值 10000 ( 2 进制的形式),但是 b 编码的取值范围不包括 10000 ,就会出现转换错误)

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

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

  62. 4, 原始字符串和普通字符串声明的字符串的默认编码跟系统环境相关, python 命令行中默认的是操作系统的编码如 windows 的 gbk , pydev 或者 idle 中,字符串的默认编码跟文件头部声明的编码一致(如果文件头部没有声明,那么默认的是 ascii 编码)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP