python 字符编码与转换

发布时间:2018-02-25 11:59:55编辑:admin阅读(3479)

    unicode 中文英文默认统一 2个字节

    ASCII 只有英文和特殊字符 每个占用1个字节 不能存中文


    每个字节由8个比特(Bit)构成


    假如一个英文文档是2M,转换为unicode 编码转换,就变成了4M

    为了解决空间浪费的问题,在unicode的基础上,出现了一个扩展集,叫UTF-8

    UTF-8编码是可变长编码。默认所有英文字母按照ASCII的形式去存储。

    所有中文字符,统一是3个字节

    英文和特殊字符,依然是1个字节


    unicode是万国编码,任何国家都可以使用。每个国家,编码都不一样的。

    比如一款游戏《大话西游》用的是gbk编码开发的。出口到欧美国家,是无法直接运行的。

    怎么办呢?把gbk转换为unicode就可以解决这个问题了。


    关于字符编码与转码

    请参考详细文章:

    http://www.cnblogs.com/luotianshuai/articles/5735051.html


    http://www.diveintopython3.net/strings.html


    需知:


    1.在python2默认编码是ASCII, python3里默认是unicode

    2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

    3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string


    下面请看一张图

    blob.png



    将字符串转换为gbk

    s = "您好"
    print(s.encode("gbk"))

    执行输出

    b'\xc4\xfa\xba\xc3'


    可以看到输出最前面有一个b 表示这是一个二进制类型,也称之为bytes类型

    那么encode("gbk"),不光是转换了编码,还转换成了二进制数据


    查看gbk和utf-8的区别

    import sys
    #打印默认编码
    print(sys.getdefaultencoding())
    
    s = "您好"
    s_gbk = s.encode("gbk")
    #打印gbk
    print(s_gbk)
    #打印utf-8,encode()默认使用utf-8
    print(s.encode())

    执行输出

    utf-8

    b'\xc4\xfa\xba\xc3'

    b'\xe6\x82\xa8\xe5\xa5\xbd'


    将gbk转换为utf-8

    import sys
    #打印默认编码
    print(sys.getdefaultencoding())
    
    s = "您好"
    s_gbk = s.encode("gbk")
    print(s_gbk)
    print(s.encode())
    
    gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8")
    print("utf8",gbk_to_utf8)

    执行输出

    utf-8

    b'\xc4\xfa\xba\xc3'

    b'\xe6\x82\xa8\xe5\xa5\xbd'

    utf8 b'\xe6\x82\xa8\xe5\xa5\xbd'


    发现转换之后,和上面的utf-8,是一模一样的。


    上面的大图显示

    gbk转换为utf8,需要2步

    1.首先通过编码【decode】转换为unicode编码

    2.然后通过解码【encode】转换为utf-8的编码


    总结:

    不同编码之间的转换,必须要先转换为unicode编码。

    先执行decode()方法,传一个参数,告诉它,我是什么编码。

    最后执行encode()方法,传一个参数,将要转换的编码是什么。


    以下代码表示,声明文件编码为

    # coding: gbk

    在python 里面,默认声明的变量是utf-8

    # coding: gbk
    import sys
    #打印默认编码
    print(sys.getdefaultencoding())
    
    s = "您好"
    s_gbk = s.encode("gbk")
    print(s_gbk)

    程序执行

    utf-8

    b'\xc4\xfa\xba\xc3'


    如果想要转换的gbk,能够正常显示

    需要执行4步

    print(s.encode("utf-8").decode("utf-8").encode("gbk").decode("gbk"))

    这一段代码就可以正常输出中文


    由于s变量,默认就是utf-8编码,不能直接使用decode()方法。

    需要先执行encode("utf-8"),再执行decode("utf-8")

    再执行encode("gbk"),输出

    b'\xc4\xfa\xba\xc3'
    由于它是一个bytes类型,需要转换为字符串,所以最后执行decode("gbk")

    得到中文 您好


    编码之间的转换,需要2个步骤。先decode(),再encode().

    转换完成之后,数据是bytes类型的,比较恶心啊。

    如果需要正常显示,得decode()一下,才能正常显示。

    注意,这里是decode()是指bytes类型与string类型之间的相互转换。



关键字

上一篇: python 文件操作2

下一篇: python 函数