python的编码问题
在python中,我们常使用encode()函数和decode()来编码和解码。
在python中,使用unicode类型作为编码的基础类型,即
decode encode
str ---------> unicode --------->str
#!/usr/bin/python
# -*- coding: UTF-8 -*-
u = u'中文' #显示指定unicode类型对象u
str = u.encode('gb2312') #以gb2312编码对unicode对像进行编码
print str #输出“中文”,由于是gb2312类型,所以输出的时候,得到乱码
u1 = str.decode('gb2312') #以gb2312编码对字符串str进行解码,以获取unicode
print u1 #输出“中文”
#u2 = str.encode('utf-8') #出错,因为str为gb2312类型,无法编码或者解码成utf-8类型。
u = '中文' #由于环境默认编码类型为utf-8,所以u的编码为utf-8
print u #输出“中文”
print u.decode('utf-8') #输出“中文”,将utf-8类型解码为unicode类型
print u.decode('utf-8').encode('utf-8') #输出“中文”,将unicode类型编码为utf-8类型输出
从以上例子中,可以看出,在python中,print能够打印中文的编码类型有unicode和utf-8。
现在计算机通用的字符编码工作方式:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为utf-8编码。
用记事本编辑的时候,从文件读取的utf-8字符被转换成Unicode字符到内存中,编辑完后,保存的时候再把Unicode转换为utf-8保存到文件:
浏览网页的时候,服务器会把动态生成的Unicode内容转换成utf-8,再传输到浏览器:
所以,当很多网页的源码上会有<meta charset='utf-8'/>的信息,表示该网页正是用utf-8编码。
在python正则表达式中,需要匹配多个中文,也需要考虑编码的问题:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
str = 'IETF 的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。'
s = re.findall('.{9}清晰.{4}'.decode('utf-8'),str.decode('utf-8'))
for i in s:
print i #结果为:RFC的一贯风格,清晰、明快又
s = re.findall('.{9}清晰.{4}',str)
for i in s:
print i #结果为:风格,清晰、�
s1的正则表达式中,由于默认的是utf-8编码,所以str和‘.{9}清晰.{4}’的编码都是utf-8,当通过decode('utf-8')解码为unicode编码后,每个汉字也代表一个字符。
s2的正则表达式中,str和‘.{9}清晰.{4}’的编码都是utf-8,但是utf-8在表示汉字的时候,一般是一个汉字占用三个字节(中文标点符号也占用三个字节),所以顿号后面显示的乱码是由于只显示了汉字“明”的三分之一,所以最终结果为乱码。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
str = u'IETF 的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。'
s = re.findall('.{9}清晰.{4}'.decode('utf-8'),str)
for i in s:
print i #结果为:RFC的一贯风格,清晰、明快又
s = re.findall('.{9}清晰.{4}',str.encode('utf-8'))
for i in s:
print i #结果为:风格,清晰、�
这个代码可以和上面对比着看,意思一样。上一篇: Python基础:编码问题
下一篇: python编码问题