欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python的编码问题

程序员文章站 2022-07-14 19:02:00
...

在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保存到文件:


python的编码问题

浏览网页的时候,服务器会把动态生成的Unicode内容转换成utf-8,再传输到浏览器:

python的编码问题

所以,当很多网页的源码上会有<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  #结果为:风格,清晰、�
    这个代码可以和上面对比着看,意思一样。