• 字符编码


    一丶知识储备

      在学习字符编码前我们要了解这么几个知识点

      1.1 三大核心硬件:cpu 内存 硬盘

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

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

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

      1.3 python解释器读取文件内容的流程

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

    二丶字符编码介绍

    1. 什么是字符编码表:字符编码表就是一张字符与数字对应关系的表
    2. 为什么要有字符编码表:人类在和计算机交互的时候用的都是人类语言,但是计算机只能识别二进制数,因此在人类的字符到计算机的数字肯定要经过一个过程:字符---->翻译--->数字 翻译的过程必须要有一个特定的标准,而这个标准就是字符编码表
    3. 字符编码表的发展历史:
      1. 一家独大ASCII表:只支持英文字符,采用8位二进制数对应一个英文字符串
      2. 百花齐放GBK表:只支持英文和中文字符,采用8位二进制数对应一个英文字符,16位对应一个中文字符    shift—JIS表,Euc—kr表
      3. 分久必和万国表:unicode 与万国字符都有对应的关系,内存中的编码表就是unicode,他的存在让任何国家的字符存在内存中都不会出现乱码问题
    4. 编码与解码:
      1. 编码:由字符串转换成内存中的unicode,以及由unicode转换成其他编码的过程,称为编码encodeencode
      2. 解码:由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decodedecode
    5. UTF-8的由来:unicode解决了在内存当中存取万国字符时乱码的问题,那在内存与硬盘之间的存取乱码又该如何解决呢:和解决内存中的乱码方法一样规定了在硬盘中读取操作时的编码—utf-8
    6. 字符串的应用:
      1. 内存中固定使用unicode无论输入任何字符都不会发生乱码 
      2. 我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了 
        1. 存乱了:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了  这是致命的会导致数据消失
        2. 读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了     
    7. python解释器执行文件的前两个步骤:前两个阶段和文本编译器相同是读取文件的过程,想要实现读不乱则必须将python解释器读文件时的编码格式设置文件当初写入到硬盘中的编码格式,如果没有设置python解释器就会使用默认的编码格式,py2默认为ACSII  py3默认为utf-8。
      #想要改动编码则在文件的第一行写上
      # coding: 当初文件写入硬盘时采用的编码格
    8. python解释器执行文件的第三个步骤:设置文件头的作用是保证运行python程序的前两个阶段不乱码,经过前两个阶段后py文件的内容都会以unicode格式存放于内存中。

        在Python3中,字符串类的值都是使用unicode格式来存储

        由于Python2的盛行是早于unicode的,因此在Python2中是按照文件头指定的编码来存储字符串类型的值的(如果文件头中没有指定编码,那么解释器会按照它自己默认的编码

        方式来存储‘上’),所 以,这就有可能导致乱码问题

    # coding:utf-8
    x = '' # x的值为untf-8格式的二进制
    print(x) # 打印操作是将x的值,即utf-8格式的二进制交给终端,当终端收到后发现并不是unicode(只有unicode才与字符有对应关系),所以终端会执行操作:utf-8二进制---解码-->unicode格式的二进制,解码的过程终端会采用自己默认的编码,而在pycharm的终端默认编码为utf-8、windows下的cmd终端的默认编码为gbk,所以该打印操作在pycharm中显示正常,而在windows下的cmd中则乱码
    
    # 在windows下的cmd中运行效果如下
    C:UsersAdministrator>python2 E:aaa.py
    涓

        python2后推出了一种补救措施,就是在字符串类型前加u,则会将字符串类型强制存储unicode,这就与python3保持一致了,对于unicode格式无论丢给任何终端进行打印,都可以直接对应字符不会出现乱码问题     # coding:utf-8 x = u'上' # 即便文件头为utf-8,x的值依然存成unicode

    总结:  

    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

                   

       

  • 相关阅读:
    使用postman做接口测试(三)
    使用postman做接口测试(二)
    使用postman做接口测试(一)
    RobotFramework安装扩展库包autoitlibrary(四)
    RobotFramework安装扩展库包Selenium2Library(三)
    记录.gitattributes 设置合并时使用本地文件无效的解决方案
    golang 踩坑日记
    linux常用命令记录
    vim配置文件
    mysql case when记录
  • 原文地址:https://www.cnblogs.com/bk134/p/12481931.html
Copyright © 2020-2023  润新知