Python学习——编码和解码

  1. 编码和解码
    编码是为了让机器读懂语言。即输入的是字符“中文”,那么编码就是将“中文” 编码为二进制格式让机器读懂

    在Python中,机器其实是不认识unicode的,而是接收的str即使输入的数据是unicode的,而在Python内部都会将unicode自动转为str

    str通过解码函数decode()转换为unicode,unicode通过编码函数encode()转换为str

    Unicode是标准统一所有语言文字的标准编码集, 它目前已经收录超过十万个字符

    Unicode包括两个方面
    编码方式(一个字符对应编码集中的二进制数值)
    实现方式(传输、存储):UTF-8、UTF-16

    Python 2.x版本有两种用于字符处理的数据格式:str和 unicode

    str 字节流是以两个单引号 ‘ ’ 或两个单引号 “ ” 来赋值的,访问一个元素就是一个字节
    unicode 字符串是在 ‘ ’ 或 “ ” 前加 u 来赋值的,同时访问一个元素则是一个 字符

    Python 3.x版本有两种表示字符串的类型:bytes 和 str
    str 类中包含 了 unicode 字符,非 unicode 编码如 UTF-8、GBK被定义成了 bytes

    使用 encode() 和 decode() 函数进行相互转换

    eg:
    c = "中文"
    print(type(c), c)
    # 使用utf-8将str类型编码为bytes类型
    c = c.encode('utf-8')
    print(type(c), c)
    # 使用默认方式将bytes类型解码为str类型
    c = c.decode()
    print(type(c), c)
    
    输出结果:
    <class 'str'> 中文
    <class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87'
    <class 'str'> 中文
    
  2. 解决乱码
    如果出现乱码的状况,那肯定是编码转码出现了问题,这不外乎有以下几个关键点:
    Python解释器设置的默认编码
    源文件设置的编码
    终端编码

  3. 解释器编码
    Python解释器的编码指Python内部认为的字符str的编码,即一个str变量,要转换为unicode时,Python解释器默认的转换方式

    Python的默认转换方式是ASCII,sys.getdefaultencoding() 函数可以获得默认编码信息

    在ASCII默认编码条件下对中文字符编码会出现错误,因为 ASCII不能对中文进行编码

    eg:
    a = u'中文'
    a.encode()
    #输出会报错
    

    对中文字符进行 GBK 编码和 UTF-8 编码

    a = u'中文'
    a.encode('gbk')
    a.encode('utf-8')
    

    中文字符 str 的解码问题

    a = '中文'
    a.decode('utf-8')
    a.decode('gbk')
    

    想要得到 GBK 编码的 str :先对其进行 UTF-8 解码,再对其进行 GBK 编码

    a = '中文'
    a.decode('utf-8').encode('gbk')
    
  4. 源文件编码
    源文件编码也就是代码文件的编码,文件不仅可以保存代码,而且还可以对数据进行存储
    文件保存数据也是有编码的。
    如果源文件中有中文,那么直接按照默认的编码方式运行Python文件的时候会出现编码错误,若想要在源码中写非ASCII文字,可以在源码文件开头加入一行:

    # coding: utf-8
    或者
    # coding: gbk
    
  5. 终端编码(cmd)
    windows中文版终端用的是CP936,通常被等同认为是GBK

    而linux系统终端用的是utf-8

    所以若不想在终端打印显示出来的字符出现乱码,则在打印前需要将打印的内容按照终端相同的编码方式进行转换

  6. 文件读写编码

    #使用 read() 读取的文件内容,得到的是 str 格式的 
    f = open('zhongwen.txt','r')
    content = f.readlines()
    f.close
    
    print type(content[1][0])
    
    输出结果:
    'str'
    
    #用UTF-8解码再用GBK编码打印出来的是乱码,这就是编码不同导致的乱码 
    print content[1][0].decode('utf-8').encode('gbk')
    
    #用write()方法写入的时候也需要是str格式。也就是说,如果写入的数据是unicode时,将会出错
    f = open('zhongwen.txt','w')
    f.write(u'中文')
    f.close()
    输出会报错
    
    #解决办法:先将 unicode 格式编码为 str ,再写入 
    f = open('zhongwen.txt','w')
    f.write(u'中文'.encode('utf-8'))
    f.close()
    
  7. 编码检测工具
    如果你发现常用的gbk、utf-8编码解码都没办法解决乱码问题,那么有可能该文本使用了这两种之外的编码方式

    chardet是一个Python包,提供测试文本的编码方法,最后返回的是对编码方法的一个估计

    eg:
    import chardet
    txt = "中文"
    print chardet.detect(txt)
    
    输出结果:
    {'confidence': 0.99, 'encoding': 'utf-8'}
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值