zoukankan      html  css  js  c++  java
  • Python学习日记(二)——字符转编码操作

    首先搞清楚:Python3的默认编码是unicode,Python2的默认编码是ASCII码

    为什么需要编解码?

    打个比方:假如说我做了一个游戏,叫《西游记》,游戏传到了日本去。但是日本人的电脑不识别中文,一打开全乱码,所以要进行转换。把中文转换成unicode,然后在转换成为日文。同理中文转换成为日文也要先转换成unicode。

    一、Python2的转编码

    Python 2 的编解码示意图

    注:上图只适用于python 2

    几个实例去理解字符的编码问题

    实例一:直接编码为unicode看是否能打印

    #-*- coding:UTF-8 -*-
    
    s = "你好"
    s_to_unicode = s.decode("utf-8")
    print(s_to_unicode)
    

    可以打印:因为unicode就支持中文,并且UTF-8是unicode的扩展集,所以在UTF-8编码下可以直接打印unicode,但是GBK就不行。

    实例二:转换成GBK后看是否能打印

    #-*- coding:UTF-8 -*-
    
    s = "你好"
    s_to_unicode = s.decode("utf-8")
    print(s_to_unicode)
    print(type(s_to_unicode))   
    s_to_gbk = s_to_unicode.encode("gbk")
    print(s_to_gbk)

     

    不可以打印:因为我的xshell终端不支持GBK编码

    默认的编码是UTF-8

    修改成默认编码后

    修改后看是否可以打印

    可以打印:因为默认语言就是windows系统编码集(GBK),所以可以打印。此时,上面的unicode没法打印出来(即使unicode可以支持GBK但是必须转码之后才能打印,因为unicode和GBK的编码不是完全一样大的,GBK的“你好”的编码在unicode里对应的不是这两个字)

     实例三:将GBK转回UTF-8

    #-*- coding:UTF-8 -*-
    
    s = "你好"
    s_to_unicode = s.decode("utf-8")
    print(s_to_unicode)
    s_to_gbk = s_to_unicode.encode("gbk")
    print(s_to_gbk) 
                
    gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
    print(gbk_to_utf8)
    

    显然可以打印

    实例四:简便的写法

    #-*- coding:UTF-8 -*-
    
    s = u"你好"
    #u"你好"表示这个字符是unicode编码
    #已经是unicode编码的字符不能进行解码,否则会报错
    print(s)
    s_to_gbk = s.encode("gbk")
    print(s_to_gbk) 
                
    gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
    print(gbk_to_utf8)
    

    二、Python3的转编码

    简介:python3会自动转换utf-8、unicode、gbk,并移除了python的unicode类型,并且转码之后不是文字是字节。

    自动转换类型的原因:因为python3的数据类型的编码是unicode所以,直接进行encode解码就行了。

    #-*- coding:gbk -*-
    #这里只是指的文件编码是gbk
    import sys
    print(sys.getdefaultencoding())
    s = "你好"
    #这里的是python本身的数据类型,本身是unicode
    #print(s.decode)
    #因为本身是unicode,所以不能进行decode命令
    print(s.encode("gbk"))
    print(s.encode("utf-8"))
    print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
    #因为最后进行了编码,所以显示出来的是字节形式
    #要想显示汉字就要decode解码下,decode要说自己是"gb2312"类型
    print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))
    

     

    注:从运行结果可以看出,GBK和GB2312的字节码是相同的

    因为:GBK向下兼容GB18030,GB18030向下兼容gb2312

  • 相关阅读:
    打包和调试静态库(2)
    打包和调试静态库(1)
    Xcode7--免证书真机调试
    开发者账号申请附录
    AFN3.0封装
    MPMoviePlayerController属性,方法,通知整理
    排序算法03--选择排序
    排序算法02--冒泡排序
    遇到别人留下的storyboard的,你需要一个引导图,但是不知道怎么跳转.
    将UIview描画成虚线等.
  • 原文地址:https://www.cnblogs.com/houzhaohui/p/7264423.html
Copyright © 2011-2022 走看看