• python学习之路 三:字符编码


    本节重点

    • 彻底掌握字符编码之前的转换关系

    • 掌握 python2 vs python3 上编码的区别

    • 掌握 python2 和python3 上bytes,str 的区别

    补充知识点:三元运算

        ​三元运算又称为三目运算,是对简单的条件语句的简写,如:

        ​if 条件成立:

        ​    ​val = 1

        ​else:

        ​    ​val = 2

        ​改写成三元运算:

        ​val = 1 if 条件成立 else 2

        ​C#中的写法 int i = 条件成立?1:2

     一.字符编码方式

    • ASCII 占1个字符,只支持英文

    • GB2312 占2个字符,支持6700+汉字

    • GBK GB2312的升级版,支持21000+汉字

    • Shift-JIS 日本字符

    • ks_c_5601-1987 韩国编码

    • TIS-620 泰国编码

        ​由于每个国家都有自己的字符编码方式,所以其对应关系也覆盖了自己国家的字符,但是以上编码都存在局限性,即:仅覆盖本国字符,无其他国家字符的对应关系,应运而生出现了万国码,他覆盖了全球所有的文字和二进制的对应关系。

    • Unicode 2-4字节,已收录了136690个字符,并还在一直不断扩张中..

        ​Uncode起到了2个作用:

        ​    ​1.直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用uncode就可以了。

        ​    ​2.unicode包好了全球所有国家编码的映射关系。

        ​Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:unicdoe表示“python”需要12个字节才能表示,比原来用ASCII多了一倍,这在进行网络传输,和硬盘存储时是不能容忍的。

        ​为了解决存储和网络传输的问题,出现了额Unicode Tranformation Format,学术名UTF,即对unicode进行转换,以便于在存储和网络传输时可以节省空间!

    • UTF-8:使用1,2,3,4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个、欧洲语系占2个、东亚占3个、其他及特殊字符占4个。

    • UTF-16:使用2、4个字节表示所有字符;优先使用2个字符、佛则使用4个字节表示。

    • UTF-32:使用4个字节表示所有字符。

        ​总结:UTF是为unicode编码设计的一种在存储和传输时节省空间的编码方案。

     二.字符在硬盘上的存储

        ​无论以什么编码在内存里显示字符,存在硬盘上都是2进制。

        ​要注意的事,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读,要不然就乱了。

     三.编码的转换

        ​虽然有了unicode和utf-8,但是由于历史问题,各个国家依然在大量使用自己的编码,比如中国的windows,默认编码就是gbk,而不是utf-8。

        ​基于此,如果中国的软件出口到美国,在美国人的电脑上就会显示乱码,因为他们没有gbk编码。

        ​为了解决这个问题,就需要使用到unicode的第2个作用,即unicdoe和各国编码的映射关系。

        ​gbk开发的软件,unicode能自动知道他在unicode中的编码是什么。这样一来,无论你以什么编码存储的数据,只要你的软件吧数据从硬盘里读到内存里,转成unicode来显示,就可以了。由于所有的系统、编程语言都默认支持unicode,那你的bgk软件放在美国电脑上,加载到内存里,变成了unicode,中文就可以正常显示了。

     四.python3的执行过程

        ​1.解释器找到代码文件,把代码字符串按文件头的定义的编码加载到内存,转成unicode。

        ​2.把代码字符串按语法进行解析

        ​3.所有的变量字符都会以unicode编码声明

     五.编码转换过程

        ​根据上述所示,python3可以直接读取硬盘上以utf-8编码格式的.py文件,因为python3会把utf-8转成unicode再展示。但是,并不是所有的软件默认编码都是unicode,python2就不是。python2依然使用的是ascii编码方式,当python2打开utf-8格式的文件时会出现乱码。解决的方案有两个,一是python2以utf-8格式打开文件,二是python2以unicode格式打开文件。这时就需要用到编码转换。

        ​我们来看看Py3自动把文件编码转为unicode是调用了什么方法。

        ​UTF-8 --> decode解码 -->Unicode

        ​Unicode --> encode编码 --> GBK / UTF-8

    六.python bytes类型

        ​python2中bytes==str,字符串就是一个个用16进制表示的2进制字节,之所以以16进制来表示,是为了增加可读性。我们称之为bytes类型,即字节类型,它把8个二进制一组称为一个byte,用16进制来表示。除此之外,python2里还有一个单独的类型unicode,把字符串解码后,就会变成unicode。

        ​python3中str和bytes分开了,str就是unicode格式的字符,bytes就是单纯的二进制。

        ​注意:python只要出现各种编码问题,无非是哪里的编码设置出错了

        ​常见的编码错误原因有:

        • python解释器的默认编码

        • python原文件的文件编码

        • Terminal使用的编码

        • 操作系统的语言设置

    掌握了编码之前的关系后,挨个排错就好了

  • 相关阅读:
    linux常用命令(二)文件上传下载及软件安装
    linux常用命令(一)linux开关机、重启以及文本界面与图形界面互换
    HTTP协议(一)基本概念、HTTP方法、HTTP状态码
    Martin Fowler 分层测试概念博文分享
    网络路由分析
    nginx 常见错误释义
    java解决共享资源竞争
    python操作excel及json
    一个简单的用python 实现系统登录的http接口服务实例
    Redis持久化之RDB&&AOF的区别
  • 原文地址:https://www.cnblogs.com/LTEF/p/9377621.html
Copyright © 2020-2023  润新知