一. 基本知识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 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,因为小一点。
欢迎拍砖! |
|