Python学习之字符编码

时间:2021-07-14 15:46:14

在Pyhon2.x版本中,字符编码是一个烦人的问题,但是在Python3.x版本中,这个问题被解决了。通常如果字符串为一串英文,编码就没有什么问题,但是通常,我们不得不面临使用中文的情况,这样在Python2.x的版本中自然就出现了编码的问题。
用事实说话:

[root@matehuafen ~]# python -V
Python 2.6.6
[root@matehuafen ~]# python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> name = '小花粉'
>>> name
'\xe5\xb0\x8f\xe8\x8a\xb1\xe7\xb2\x89'
>>>

可以看到我的Python版本为2.6.6版本,但是当我尝试输出变量时,发现输出一串编码,并不是我定义的值。这就是中文出现的编码问题。
对于什么是编码,允许我谷歌一下
*中的定义:字符编码(英语:Character encoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。

在Pyhon 3.x版本中,采用的字符集编码是unicode编码,但是在2.x版本中,采用的是ASCII编码
对于这两个不同的编码,如果有兴趣,可以去谷歌一下
通常,只有Unicode编码是不够的,所以,有了对Unicode实现方式的转换格式,这种格式便成为UTF(Unicode Transformation Format)。我们能够常见到的是utf-8
编码和解码
在Python中,有两个内置函数,分别为encode(编码)和decode(解码),encode可以将对象的编码转换为指定的编码格式,而decode是encode的一个逆过程。
实例演练:

>>> string = "我喜欢Python"
>>> string
'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2Python'
>>> type(string)
<type 'str'>
>>> len(string)
15
>>> Tstring = string.decode('UTF-8')
>>> Tstring
u'\u6211\u559c\u6b22Python'
>>> type(Tstring)
<type 'unicode'>

其实比较难理解,我们可以使用decode指定解码的编码。慢慢来,慢慢的就理解了。
那么,如何避免中文乱码呢?
前面说关于编码谷歌,当你谷歌的时候,你会发现,有很多字符编码。但是通常,在我们的工作学习当中,使用UTF-8就可以解决很多编码的问题,因为它具有跨平台性。感觉好熟悉,哈哈,对了,就像java语言一样,一次编写,到处运行。
方案一
在程序开头加入 # —– coding:utf-8 —-
也可以写成 # coding:utf-8
方案二
遇到字符串,直接一点吧,直接用unicode不要使用str( )

>>> unicode_string = unicode("我喜欢Python",encoding='UTF-8')
>>> print unicode_string.encode('utf-8')
我喜欢Python

方案三
如果是对文件操作,打开文件的时候,最好使用codecs.open来替代open
import codecs
codecs.open(‘filename’,encoding=’utf-8’)

以上就是对于Python字符编码的了解和学习。
预告,下一篇为列表List。