跟老齐学Python之坑爹的字符编码(3)
不再多引用了,如果要看更多,请到原文。
看官现在是不是就理解了,前面写程序的时候,曾经出现过:coding:utf-8的字样。就是在告诉python我们要用什么字符编码呢。
encode和decode
历史部分说完了,接下怎么讲?比较麻烦了。因为不管怎么讲,都不是三言两语说清楚的。姑且从encode()和decode()两个内置函数起吧。
codecs.encode(obj[, encoding[, errors]]):Encodes obj using the codec registered for encoding.
codecs.decode(obj[, encoding[, errors]]):Decodes obj using the codec registered for encoding.
python2默认的编码是ascii,通过encode可以将对象的编码转换为指定编码格式,而decode是这个过程的逆过程。
做一个实验,才能理解:
>>> type(a)
<type 'str'>
>>> a
'\xe4\xb8\xad'
>>> len(a)
3
>>> b = a.decode()
>>> b
u'\u4e2d'
>>> type(b)
<type 'unicode'>
>>> len(b)
1
这个实验不做之前,或许看官还不是很迷茫(因为不知道,知道的越多越迷茫),实验做完了,自己也迷茫了。别急躁,对编码问题的理解,要慢慢来,如果一时理解不了,也肯定理解不了,就先注意按照要求做,做着做着就豁然开朗了。
上面试验中,变量a引用了一个字符串,所谓字符串(str),严格地将是字节串,它是经过编码后的字节组成的序列。也就是你在上面的实验中,看到的是“中”这个字在计算机中编码之后的字节表示。(关于字节,看官可以google一下)。用len(a)来度量它的长度,它是由三个字节组成的。
然后通过decode函数,将字节串转变为字符串,并且这个字符串是按照unicode编码的。在unicode编码中,一个汉字对应一个字符,这时候度量它的长度就是1.
反过来,一个unicode编码的字符串,也可以转换为字节串。
>>> c
'\xe4\xb8\xad'
>>> type(c)
<type 'str'>
>>> c == a
True
关于编码问题,先到这里,点到为止吧。因为再扯,还会扯出问题来。看官肯定感到不满意,因为还没有知其所以然。没关系,请尽情google,即可解决。
python中如何避免中文是乱码
这个问题是一个具有很强操作性的问题。我这里有一个经验总结,分享一下,供参考:
首先,提倡使用utf-8编码方案,因为它跨平台不错。
经验一:在开头声明:
# -*- coding: utf-8 -*-
有朋友问我-*-有什么作用,那个就是为了好看,爱美之心人皆有,更何况程序员?当然,也可以写成:
# coding:utf-8
经验二:遇到字符(节)串,立刻转化为unicode,不要用str(),直接使用unicode()
unicode_str = unicode('中文', encoding='utf-8')
print unicode_str.encode('utf-8')
经验三:如果对文件操作,打开文件的时候,最好用codecs.open,替代open(这个后面会讲到,先放在这里)
import codecs
codecs.open('filename', encoding='utf8')
我还收集了网上的一片文章,也挺好的,推荐给看官:Python2.x的中文显示方法
最后告诉给我,如果用python3,坑爹的编码问题就不烦恼了。






