分享

python 编码总结

 dinghj 2014-04-29

一. 基本知识

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解析源文件的流程


流程图 reference  : http://www./dev/peps/pep-0263/

三. 遇到的问题

遇到的问题的例子比较多,这里不一一列举了,找了几个比较好的参考资料

1.  http://zzjjzzgggg./blog/311666

2. http://zzjjzzgggg./blog/309409

3. http://www./topic/560229

4. http://www./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,因为小一点。

 

 

欢迎拍砖!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多