• 15、字符编码


    一、写在前面之三大核心硬件

    1.1 三大核心硬件

      所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘,我们需要明确三点。

    #1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的
    
    #2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
    
    #3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘
    

    1.2 文本编辑器读取文件内容的流程

    #阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)
    
    #阶段2、文件编辑器会将文件内容从硬盘读入内存
    
    #阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上
    

      

    1.3 python解释器执行文件的流程

      以python test.py为例,执行流程如下:

    #阶段1、启动python解释器,此时就相当于启动了一个文本编辑器
    
    #阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
    
    #阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法
    

    1.4 总结

      python解释器与文件本编辑的异同如下:

    #1、相同点:前两个阶段二者完全一致,都是将硬盘中文件的内容读入内存,详解如下
    python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样
    
    #2、不同点:在阶段3时,针对内存中读入的内容处理方式不同,详解如下
    文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法)
    

    二、字符编码介绍

      

    2.1 什么是字符编码?

      人类在与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、日文字符等,而计算机只能识别二进制数,详解如下:

    #二进制数即由0和1组成的数字,例如010010101010。计算机是基于电工作的,电的特性即高低电平,人类从逻辑层面将高电平对应为数字1,低电平对应为数字0,这直接决定了计算机可以识别的是由0和1组成的数字
    

      由人类的字符到计算机中的数字,必须经历一个过程:
      字符——>翻译——>数字
      翻译的过程必须参照一个特定的标准,该标准称之为字符编码表,该表上存放的就是字符与数字一一对应的关系。

    2.2 字符编码表的发展史

      字符编码的发展经历了三个重要的阶段:
      Ⅰ、一家独大:起源于美国,诞生了ASCII表;

    1、只支持英文字符串
    2、采用8位二进制数对应一个英文字符串
    

      Ⅱ、诸侯割据、天下大乱:每个国家都各自的字符,为让计算机能够识别自己国家的字符外加英文字符,各个国家都制定了自己的字符编码表;

    GBK表(中国):
    1、支持英文字符、中文字符
    2、采用8位(8bit=1Bytes)二进制数对应一个英文字符串;
    3、采用16位(16bit=2Bytes)二进制数对应一个中文字符串
    

      Ⅲ、分久必合:unicode于1990年开始研发,1994年正式公布,具备两大特点:

    1、兼容万国字符,与万国字符都有对应关系。
    2、采用16位(16bit=2Bytes)二进制数对应一个中文字符串,个别生僻会采用4Bytes、8Bytes。
    
        unicode表:
                              内存
            人类的字符---------unicode格式的数字----------
                                 |                     |
                                 |                     |
                                 |
                                硬盘                    |
                                 |
                                 |                     |
                                 |                     |
                            GBK格式的二进制       Shift-JIS格式的二进制
    
            老的字符编码都可以转换成unicode,但是不能通过unicode互转
    

    2.3 utf-8

      理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的,但由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)

    # 多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(utf-8格式的二进制)
    

      那为何在内存中不直接使用utf-8呢?

    1、utf-8是针对Unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储
    
    2、unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8,天下重新归于统一
    

    三、结论

    1、内存固定使用unicode,我们可以改变的是存入硬盘采用格式:
            英文+汉字-》unicode-》gbk
            英文+日文-》unicode-》shift-jis
            万国字符》-unicode-》utf-8
    
    2、文本文件存取乱码问题
            存乱了:解决方法是,编码格式应该设置成支持文件内字符串的格式
            取乱了:解决方法是,文件是以什么编码格式存如硬盘的,就应该以什么编码格式读入内存
    
    3、python解释器默认读文件的编码:
            python3默认:utf-8
            python2默认:ASCII
    
            指定文件头修改默认的编码:
            在py文件的首行写:
                #coding:gbk
    
    4、保证运行python程序前两个阶段不乱码的核心法则:
            指定文件头
            # coding:文件当初存入硬盘时所采用的编码格式
    
    5、python3的str类型默认直接存成unicode格式,无论如何都不会乱码
            保证python2的str类型不乱码
                x=u'上'
    
    6、了解:
            python2解释器有两种字符串类型:str、unicode
            # str类型
            x='上' # 字符串值会按照文件头指定的编码格式存入变量值的内存空间
            # unicode类型
             x=u'上' # 强制存成unicode
    
  • 相关阅读:
    phpexcel Could not open for reading! File does not exist.
    tp5 微信JSAPI支付
    ajax返回数据不跳success
    tp5 paginate带参翻页
    php 小程序 前后端POST通信
    小程序页面跳转不同方法
    小程序添加购物车
    小程序商城数量加减效果
    Include conf/extra/httpd-ssl.conf apache 无法启动
    SQL 实验详细源码参考
  • 原文地址:https://www.cnblogs.com/zuiyouyingde/p/12483060.html
Copyright © 2020-2023  润新知