• python 字符编码


    一、计算机简单说明

    # 计算机的主要组成部分:cpu, 内存, 硬盘
    # cpu :中央处理器,所有的操作都需要cpu完成
    # 内存:运行数据的存储地址,关机数据即丢失
    # 硬盘 :用于数据存储,关机数据不会丢失

    二、文本编辑器读写操作

    # 已编写文档举例
    # 1、打开文件编辑器  (打开运用程序,将运用程序数据存储值内存)
    # 2、编写内容           (在内存中编写内容)
    # 3、保存编写内容至文件 (将内存中的内容保存至硬盘文件)
    # 4、再次打开文件修改内容  (编辑器将硬盘文件读到内存中)

    三、字符编码介绍

      3.1 什么是字符编码?

    #    通俗的来说,字符编码就是按照某种格式某种规定将字符存储在计算机中。
    #    我们都知道计算机只能识别二进制(即0和1)的数字,但是计算机发展到今天我们都有了个人的笔记本,可是我们发现我们的电脑除了0-9的数字外还有中文,英文,这是怎么回事呢?
    #    很显然我们0和1数字向语言的一个转变的过程,中间一定发生什么。
            

         #字符--------(翻译)---------二进制数      #这个翻译就是一个字符如何对应一个特定的二进制数的表中,这个标准就是字符编码 

      3.2 字符编码发展史

        3.2.1 早期ASCII码

          计算机最早由美国人发明的,所以最早的也是美国的ascll码,如图

          首先看一下高四位和低四位:在这张表中,

            字符 0  对应的高四位 0011 低四位 0000      即 00110000

            字符 A  对应高四位 0100 低四位 0001         即 01000001 

          由此可以得出 美国的ascii码一个字符即代表一个8位的二进制数字,即一个字节代表8位二进制数(1bytes = 8bits )

          注意:一个四位的二进制可以表示一个一位的16进制数,也就是说一个8位的二进制一个表示成一个2位的16进制,所以你可能看到的都是16进制的

        3.2.2 世界各国编码

          gb2312:

            我们看到美国的ascll码,所有的字符只占了128个(0-127),而8位的二进制一共可以占256个,说明还有128 个字符可以使用。但是很抱歉中文常用汉字就需要有3000多个,很明显如果一个字节(8位二进制数) 根本没有办法满足中国需求。怎么办?

            一个不行就用两个。gb2312 为兼容ascll码,第一个字节在0-127内的则为美国字符,如果第一个在127-?(这个不知道是多少,反正保留了很多)中,则为中文字符,一个字节可以表示256 个字符,两个则为256*256 ,所以中文常用3000个汉字用二个字节绰绰有余。

          GBK:

            GBK是在gb2312的基础上扩展出来的.

          外国编码:

            中国有中国的编码,外国也一定有自己的编码,例如日本的Shift_JIS,韩国的Euc-kr.

        3.2.3 万国码 unicode

          一个问题: 日本的软件在日本的电脑上可以正常显示(shift-js编码),如果拿到中国来用就会出现乱码(中国的GBK编码无法解码日本的编码字符) 那怎么办呢?

            我们可以在中国的电脑上添加日本的shift-js字符编码不就可以正常显示了吗!!!!很好,确实可以这样做,但是如果你再想编写中文的文本就会出问题,因为中文的字符编码不兼容日本的字符编码(因为高位冲突)

            所以我们迫切的需要一个即能够兼容中文又能兼容日文的字符编码-------unicode万国码运用而生.unicode 兼容世界所有的字符.但是每一个字符都占用两个字节,生僻字更多.内存中使用该字符编码

        3.2.4 可变成长编码utf-8(目前最常用的字符编码,被各国所介绍)

          unicode 的出现解决了乱码问题,但有一个新问题,如果你的文本如果通篇都是英文,那么使用unicode 就会比ascii码多一倍的空间,本着节约的原则又出现了“可变长编码utf-8” utf-8 支持万国文字.(unicode 兼容utf-8)

    # utf-8:
    #
    英文占一个字节 # 中文占三个字节

       3.3 总结

    #总结:内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。

    四、字符编码运用之文本编辑器

       4.1 打开txt文件的三个阶段

    # 阶段一:打开文本编辑器
    # 阶段二:将硬盘文件内容已默认的编码转化成unicode万国码存储到内存中
    # 阶段三 :文本编辑器中显示内存文本内容

      4.2 保存txt文件的二个阶段 

    # 阶段一: 将内存中的unicode编码的字符转成文本编辑器默认的编码字符
    # 阶段二: 转化后刷到硬盘中去

      4.3 图解读写txt文件操作

      4.4 乱码根源

    # 在万国码unicode 出现之前,乱码问题一直存在,但今天我们任然还会在无意识间发现一些中文乱码。
    # 例如我们在mac电脑上面编写一个txt的文件,但是拿到windows电脑上就乱了。
    # 又例如我们在linux终端上执行文件,可以windows终端上就各种乱码问题
    # 再例如我们在windows的文本编辑器上写了中韩两种语言,保存再打开时,中文可以正常显示,韩文确实乱码,这又事什么原因呢?
    
    # 其实说那么多,上面的文本编辑关于字符编码解码的过程,你心里应该知道为什么了。
    
    # 原因无外乎两种:
    # 1、内存中unicode字符 在编码成 其他字符往 硬盘中存的时候,没有找到该字符在另一字符编码中的对应的位置。所以造成了电脑无法识别乱存了一个???的字符
    # 2、硬盘文件向内存解码的过程中,原本硬盘文件中的内容是例如是utf-8,但在解码时使用gbk进行解码操作,导致unicode 无法识别,进而出现了乱民问题
    
    
    # 总结:
    # 要想保证不乱码:
    #    1、存时保证内容在默认编码中有对应位置
    #    2、读时保证文本的默认编码与存时的编码一致
    乱码分析和解决

    五、字符编码之python运用

      5.1 执行python文件的三个阶段

    #已 python test.py 为例
    
    # 阶段一:启动python解释器
    # 阶段二:将test.py 文件内容转成unicode 字符编码,加载到内存中
    # 阶段三 :python 解释执行内存中的文件内容
    
    
    # 注意:
    #     阶段二,test.py 在解码成unicode 编码时,需要按照某种字符解码。
    #     python2 默认 ascii
    #     python3 默认 utf-8 
    #     如果文件头部分有coding:XXX ,则按照XXX解码,如果没有则按照默认的进行解码操作
    
    #     阶段三,执行代码的过程中,如x='jmz', python 运用程序会开辟两个空间,一个是名称空间,用来存储 x 和'jmz'的内存指向地址,一个是内存空间存储'jmz'。python2和python3 中'jmz' 在内存中的字符编码是不一样的。下面会说明。
    执行过程,非常重要!!!

      5.2 执行test.py文件--图解

         1、文本编辑器写一个test.py代码

          2、python3 解释器执行test.py文件

        出现了错误:utf-8 编码无法解析test.py 文件

        原因:windows默认是gbk 编码,所以我们要在文件的开头写一个# coding:gbk 就可以了(python解释器会通过文件头来确定使用哪种编码解码文件内容)

        3、在windows终端执行test.py 文件就可以正常显示文字

      

      5.3 python2 与python3 的区别

    # python2:默认ascii码
    # python3:默认utf-8
    
    #在读取文件时会使用默认编码解码文件内容,文件头如果定义了编码,就使用文件头的编码解码编码。
    
    # python中开辟内存空间时,会将内存中的unicode变量,编码成默认的编码进行存储。
    # 也就是 python2 使用ascii 编码存储
    # python 3 则不同,它没有编码过程,而是直接以unicode 进行储存的。所以无需编码,解码

      5.4 补充

    # 1、强烈建议使用python3 
    #        如果使用python2 请一定要在文件头写上# coding:utf-8, 非英文字符,一定要在变量前加u 如下
    name = u'中国人'      # 表示已unicode 形式存入内存空间。
    
    
    # 2、字符编码的转换,
    #      python3 可直接转化成其他编码(因为内存空间中本身存储的就是unicode)
    #      python2 如果变量前+u了,则与python3 一致,如果没有,则需要解码成unicode在编码成其他编码 (python2中内存空间编码不一定是unicode编码字符)
  • 相关阅读:
    Java抽象类和接口和继承之间关系
    Java程序中解决数据库超时与死锁
    怎样成为一名出色的Java Web程序员?
    Java中断线程的方法
    Java 集合框架(Collection)和数组的排序
    StringBuffer帮你减轻Java的负担
    学好Java开发的关键七步
    kvm的分层控制
    一个高扩展高可用高负载的应用架构的诞生记(原创)
    防火墙规则
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/9006611.html
Copyright © 2020-2023  润新知