• pyhton编码解码理解


    先放学习链接,看了这几篇博客,感觉还是有收获的:

    https://www.cnblogs.com/linjiqin/p/3674825.html

    https://blog.csdn.net/can0227/article/details/83240705

    https://blog.csdn.net/liuchunming033/article/details/52223612

    编码解码是怎么一回事,到底是怎么变来变去的?

    Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。

    而str形式呢,就是字符串形式,它都是以一定的编码格式存在的。常见的编码格式有utf-8、ASCII、gb2312等等,由此可见,肉眼见到的 str 形式一般是看不出来什么编码的哦。

    unicode 感觉就单纯很多了,他就是unicode

    所以: 编码就是 unicode -> str,解码就是 str -> unicode,先大体有这么个概念吧。

    具体语法是怎么写呢?

    不同编码格式的字符串之间相互转换编码格式的话,都要先解码成unicode再编码成其他编码格式的字符串 如果直接将 str encode的话他会先按照默认的编码方式解码再编码

    如str1是gb2312编码的,将str1转成utf-8编码的字符串,需要这么做:  str1.decode(‘gb2312’).encode(‘utf-8’)。

    sys.defaultencoding指明了默认的字符串解码方式。即在解码时没有明确指明解码方式的时候使用。比如字符串默认的解码方式为“utf-8”, str1是gb2312 编码的, str2是utf-8编码的,那么对于str1.decode() 和 str2.decode(), str2就能解码成功,但是str1不可以。

    练习:

    #! /usr/bin/env python 
    # -*- coding: utf-8 -*- 
    s = '中文'  # 这里的 s 是utf-8编码的字符串类型
    s.encode('gb18030') 

    上面一段代码第二行就指明了该py文件里面的字符串默认编码格式是utf-8的,所以s这个字符串就是utf-8编码的字符串。

    第4句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为s本身就是 str 类型的,因此 Python 会自动的先将 s 解码为 unicode,然后再编码成 gb18030。 

    而当对s进行解码的时候,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是ANSCII,如果 s 不是这个类型就会出错。

    ⚠️注意:从这里我才意识到 原来第二行声明的:coding:utf-8 和 sys.defaultencoding 并不是一样的呢!!!coding 指的应该是字符串的编码, 而sys那个指的是解码的时候默认给你选择的类型,只有两个一样时才会成功,不一样就 GG 啦!

    有两种办法改正:

    1. 现将 s 指明解码方式解码后再编码。s.decode('utf-8').encode('gb18030')

    2. 改变默认编码方式后再编码,加上 sys.setdefaultencoding('utf-8')后, 再运行 s.encode('gb2312')便可以成功

    延伸1:

    python2 中字符串的默认编码为 ASCII , python3中字符串的默认编码为 unicode

    python2 默认解码为ASCII, python3中默认解码为 utf-8

    所以在python3中字符串就是unicode了,直接编码就可以了。至于在终端下为什么不会直接展示字符,而是展示类似于 b'xb9xfexb9xfe', 那就和你的电脑本身的编码有关了。

    在终端下输入 locale , 我的电脑显示 LANG="zh_CN.UTF-8" ,说明我的电脑展示就是用的 utf-8 编码,所以不能正常展示 gb2312 的编码

    延伸2:

    str典型编码类型:gbk,utf8; 表现形式:xc4xe3xbaxc3。

    而看到类似于u4f60,就需要明白,这个是中文的unicode编码或者说是unicode表示,未经具体的utf8或gbk编码 。

  • 相关阅读:
    Linux下PHP升级的方法
    centos6 授权文件夹所有用户可用
    重置密码遇到ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor:yes)问题
    MySQL Daemon failed to start. 正在启动 mysqld:[失败]
    MySql取消密码强度验证功能
    twbsPagination.js分页插件
    同一个Tomcat部署多个springboot项目问题
    同一个tomcat部署多个项目导致启动失败
    启动Spring boot项目报错:java.lang.IllegalArgumentException: LoggerFactory is not a Logback
    Vue中关于vue-awesome-swiper插件使用以及要注意的 “坑”
  • 原文地址:https://www.cnblogs.com/mlllily/p/11243996.html
Copyright © 2020-2023  润新知