设为首页 收藏本站
查看: 980|回复: 0

[经验分享] python 编码总结

[复制链接]

尚未签到

发表于 2017-4-22 11:57:58 | 显示全部楼层 |阅读模式
一. 基本知识
  1. 如果py文件里面不指定源文件需要用到的编码格式的话,python解析器就会用默认的编码去解析,一般是ASCII, 所以如果此时源文件有中文的话就会报错,‘SyntaxError: Non-ASCII character......’, 因此一定要显示指定编码格式,方法是在py文件第二行加入此句:' #-*- coding: gbk -*-'  , 就指定编码格式为gbk了。当然写法上还可以是满足这样的正则表达式的句子: 'coding[:=]\s*([-\w.]+)'
  注意: 一般声明的coding要和文件编码一致,这样最稳妥!
  2.  python中 s = ‘中文' 和 s = u'中文'的区别:
  s = '中文' 要变成python解析器识别的unicode,那就要在运行时才能。因为解析器会在运行时把s变量decode成unicode。
  而s = u'中文'则是在编译的时候就变成unicode了,并且会保存在对应的pyc文件中。
  所以两者的区别其实就是什么时候变成unicode,而且作为参数传递时有u的直接就是unicode对象了,而没有u的只是python中的普通的str, 需要变成unicode来用时需要调用decode或者unicode函数来处理。两者的联系就是他们的最终结果都是unicode。
  3. 文件的编码
  3.1 在编码问题中,其实文件本身的编码也是很重要的。如何查看?用vim的话,可以通过在vimrc文件加入'set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1' 来检测文件的编码格式,会按照你列的编码顺序来检测该文件的编码。具体做法是加入那句以后,用vim打开该文件后,用set fileencoding来查看。
  3.2 文件的编码其实就决定了你在文件中写一句 s = '中文'的时候,这个s的值是什么编码。也就是说,如果文件编码是gbk,那么s就是gbk编码,你要变成unicode来用就要s.decode('gbk').
  4. python文件中的中文有人是建议都用u'xx'的写法变成unicode,然后在需要转换显示的时候才转,我表示同意。
二. python解析源文件的流程
  
DSC0000.jpg
  流程图 reference  : http://www.python.org/dev/peps/pep-0263/
三. 遇到的问题
  遇到的问题的例子比较多,这里不一一列举了,找了几个比较好的参考资料
  1.  http://zzjjzzgggg.iteye.com/blog/311666
  2. http://zzjjzzgggg.iteye.com/blog/309409
  3. http://www.iteye.com/topic/560229
  4. http://www.iteye.com/topic/699510
  5. 用simplejson 来转换数据:
  simplejson提供两类API:
  1) loads: 将python的object转化成字符串(<type: 'str'>)
  2) dumps : 将字符串转化成python的object.
  loads明显是有个encode的过程, 那么肯定有个encoding来指定encode时候的编码, 不指定默认是用utf-8的;
  同样dumps明显就有个decode过程, 同样有个encoding来指定, 默认也是为utf-8;
  以前遇到一个问题是, 通过http接口获取过来的json数据编码是gbk的, 但是我在loads的时候没有指定encoding,
  结果出现乱码, 找了很久才发现了问题, 所以我警惕之后调用这2个接口的时候都最好显示指定encoding,这样
  虽然麻烦了, 但是对于查找问题和代码可读性方面都是有好处的!
  经验是如果遇到编码问题,可以从一下几个方面去思考:
  1)文件本身的 编码
  2)声明的编码
  3)如果数据是从网络获取的或者其他途径,反正就不是自己的,那么建议代码中加入try...except  UnicodeEncodeError, UnicodeDecodeError 之类的代码做好防范。
  4)建议采用utf-8编码,如果实在是对数据量有要求的可以用gbk,因为小一点。
  欢迎拍砖!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-367747-1-1.html 上篇帖子: 零基础学python-1.1 安装python 下篇帖子: 服务器暂时无法响应您的请求 500 Internal Server Error
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表