美文网首页大数据 爬虫Python AI Sql
python编程的一大坑:python处理中文编码和解码中常见的

python编程的一大坑:python处理中文编码和解码中常见的

作者: 梦想编程家小枫 | 来源:发表于2019-05-02 17:11 被阅读1次

    unicode

    ascii默认八位存一位,而unicode默认是16位存一个,所有英文用ascii都是8位,但是使用unicode都是16位,于是出现了一个unicode的扩展集,utf-8,可变长的,所有的英文还是按照ascii存储,一个字节,所有的中文全部三个字节,可以简单的把unicode看成所有编码集的大家长,它包含一切,任何编码集都可以在它中找到。

    python2

    在python2中默认的编码格式是ascii,此时str=“你好”,那么这个你好是ascii编码,会报错,而且当encode()不指定参数的时候也是默认先用ascii编码码的,在python2上写# -*- coding: utf-8 -*-的意思是该程序使用utf-8编码,这样str=“你好”,那么就是utf-8编码的了,但是encode()不指定参数的时候,默认也是使用ascii编码的

    注:想学习Python的小伙伴们

    可以

    进群:984137898

    领取从0到1完整学习资料 视频  精品书籍 一个月经典笔记和99道练习题及答案

    python3

    而在python3中默认的编码格式是unicode,这个这样理解,当我们在程序中str=“你好”这个str是unicode编码的,当我们encode()没有指定编码集的时候,这个encode是按照utf-8进行编码的。而python3上写#-*- coding: gbk -*-意思是该程序使用gbk编码,但是str=“你好”依然是unicode编码的,而且encode()没有指定编码集的时候,这个encode是按照utf-8进行编码的。所以个人认为在python3的时候,页面编码使用gbk没有任何意义

    该方法输出当前默认的编码

    python3输出utf-8,但它的默认编码格式是unicode

    以下代码使用python2级版本

    python2中该程序在str.encode()之前会默认按照ascii解码有一部隐式操作(python3中没有,因为一开始就是unicode编码的),虽然有(# -*- coding: utf-8 -*-),所以中文用ascii解码当然会出问题了,解决办法就是手动进行解码,这样就不会用ascii解码了

    该程序没有出问题是因为手动使用了utf-8进行了解码,这样在解码的时候就不会有一个隐形的ascii解码了,str因为# -*- coding: utf-8 -*-所以默认使用utf-8编码,用utf-8进行解码str1此时是unicode,unicode可以正常显示中文的,再用utf-8进行编码还是你好

    将utf-8编码的str转成gbk编码的

    按照道理来说unicode是大家长,编码成gbk也应该是没有问题的,那为何输出乱码呢?

    其实编码成gbk这一步没有任何问题,问题出在了控制台显示的编码上,因为我的pycharm编码为utf-8,所以utf-8直接解码gbk肯定会出问题,所以,把pycharm的编码改成gbk就ok了

    将刚才的gbk转成utf-8

    编码和解码

    演示完这两个之后,因为unicode可以看成大家长,所以中文可以在两种编码之间进行转换时,可以使用unicode来进行过渡,一种编码先解码成unicode,再编码成另一种编码

    这个图说明只能unicode编码成其它,其它解码成unicode

    因为# -*- coding: utf-8 -*-,所以str=“你好”将会默认使用utf-8进行编码

    也可以str=u“你好”

    前面使用u,所以表示你好使用uncicode编码,输出也会正常输出中文,因为unicode包含一切

    以上都是在2级版本的讲解,

    其实所有版本两种编码的转换都一样,就是通过unicode进行转换,所以其它两种编码(不只是utf-8和gbk)都是按照unicode做中间转换的思想去转换

    在python3中默认的编码格式是unicode,这个这样理解,当我们在程序中str=“你好”这个str是unicode编码的,当我们encode()没有指定编码集的时候,这个encode是按照utf-8进行编码的。

    在python3中程序的默认编码unicode

    所以在python3中只要str=“你好”那么这个你好默认是unicode进行编码

    可以对其进行编码,编成gbk

    python3编码其实有两个过程,一个是编码utf-8,gbk这样的,一个是编码成子节数组,所以下面输出了编码成gbk的自节数组,同理解码也有两个过程是和它相反的

    下面程序,你好是unicode编码,所以可以方便的将其编码成gbk,不会出问题

    可以看输出结果,第一输出的是gbk编码的了,第二输出的是编码好的子节数组

    右下角这个是该文件的编码格式,个人感觉没什么用,因为在python2为了输入中文,我们必须要指定#-*- coding: 编码 -*-,这样右下角这个文件编码会根据#-*- coding: 编码 -*-而变化

    这个在python3中如果右下角是gbk,那么就一定要写一句# -*- coding: gbk -*-不然会出问题,但是即使写了也没有任何效果在python3中无论是写# -*- coding: utf-8 -*-还是# -*- coding: gbk -*-都不会有效果,str=“你好”依然是unicode编码

    相关文章

      网友评论

        本文标题:python编程的一大坑:python处理中文编码和解码中常见的

        本文链接:https://www.haomeiwen.com/subject/ktnnnqtx.html