02-Python中文乱码

作者: 百川一页 | 来源:发表于2017-10-23 19:17 被阅读547次
    Python中文乱码.png

    点我观看配套视频


    一、基本概念

    1. 比特位(Bit)

    是计算机最小的存储单位
    以0或1来表示比特位的值
    

    2. 字节(Byte)

    是计算机中数据存储的基本单元
    一字节等于一个8个比特位
    

    3. 字符(Character)

    是一个信息单位
    是各种文字和符号的统称
    

    4. 字符集(Character Set)

    是某个范围内字符的集合
    不同的字符集规定了不同字符的个数
    

    5. 字符码(Code Point)

    字符集中每个字符的数字编号
    

    6. 字符编码(Character Encoding)

    是将字符集中的字符码映射为字节流的一种具体实现方案
    ASCII 编码、UTF-8 编码、GBK 编码
    

    7. 编码(Encoding)

    编码的过程是将字符转换成字节流
    

    8. 解码 (Decoding)

    解码的过程是将字节流解析为字符
    

    二、具体解释

    1. 我们想做的事情,最终的目的?

    • 将文本内容存储到存储器当中
    • 从存储器中取出来文本内容进行相关操作
    最终目的.png

    2. 存储器的能接受的存储方式?

    • 你现在要把文本内容存储在存储器里面;所以你能不考虑它的感受?
      • 举个例子 --- 商场的储物柜
        商场的储物柜.png

        储物柜组成:一个大箱子有很多小柜子;一个小柜子里面有几个小格子;
        (1) 请问:你租柜子的时候,能租一个格子吗?不能,只能租一个柜子;对不对?所以一个柜子就是一个“基本存储单元”;
        (2) 请问:小柜子里面真正放东西的时候,是不是放在小格子里面?所以,一个小格子,就是 “最小存储单位”;

      • 类比到存储器的存储结构,如下:
        存储器的存储结构.png

    3. 存储目的的抽象

    • 我们的最终目的

      最终目的.png
    • 抽象后的图示

      把一个个字符,存储到存储器.png

      存储的过程称为 “编码”
      取出的过程称为 “解码”

    4. 引发的问题?

    • 如何存储字符?(字符都是一些a,b,c,1, 2, 3等等; 存储器只能存储0和1)

      引发的问题及答案.png
    • 按照怎样的规范进行存储?(每个字符占用多少字节?)

      按照怎样的规范进行存储.png

    5. 解决方案(统一的标准:编码解码规范)

    • 由具体的编码,来确定每一个字符所对应的数值;让存储器直接存储数值就可以;到时候,解码的时候;取出对应的数据,再按照编码规范找到对应的字符即可
      解决方案.png

    6. 乱码的原因?

    • 存字符“a”的时候,按照编码1,转换的数值是97;
    • 下次从存储器取出来数值97之后,居然按照编码2,进行解码;
    • 而编码2里面的97,有可能对应的是s;
    • 这样就造成“乱码”;(如上图)
      所以,避免乱码的方式就是;保证编码和解码使用的是同一套字符编码;

    7. 既然乱码是由使用了不同的字符编码引起的;那为什么搞这么多套?合成一套,弄一个标准不就可以了?

    言之有理,但凡事都是一个发展进化的过程;
    而且,“大而全”不一定好;拖拉机拉货特别多;你能开着去上班吗?
    
    • 细看“字符编码”发展历程
    1. 计算机最早发明于美国, 英语中主要就包括26个字母(大小写), 10个数字, 标点符号, 控制符等等; 所以, 最终就制定了ASCII字符编码, 映射了字符和字符码的关系, 并使用一个字节的后七位(0 - 127)来存储; (当时真TM没想到, 计算机会普及)
    1. 慢慢计算机普及到西欧其他地区, 发现好多字符没法识别处理; 于是对ASCII进行了扩展, 叫 EASCII编码; 还是一个字节, 从128 – 255; 但是针对于这一块的扩充, 各个厂家各有自己的标准(比如当时比较有名的CP437); 最后导致互相之间没法沟通; � 所以, 后来, 由国际标准化组织(ISO) 以及国际电工委员会(IEC)联合制定了一个标准 ISO/8859-1(Latin-1), 继承了CP437的128-159; 重新定义了160-255;
    1. 然后到中国之后, 全都懵逼了; 汉字博大精深, 一个字节肯定不够; so, 国人自己搞了一个GB2312来存储中文, 6763个汉字;(双字节, 兼容ASCII)� 可是, 一开始还很爽; 后来发现还有繁体字, 藏文, 蒙文, 维吾尔文… 懵逼X2; 于是一狠心, 搞了一个GBK, 全给他们搞进来;
    1. 中国是搞定了, 那日本,韩国… … 如果到时候, 各有各的字符编码, 那该怎样沟通?比如 666 , 在中国代表NB; 在岛国代表SB, 那就乱套了;� 所以, 统一联盟国际组织, 提出了Unicode编码; 涵盖了世界上所有的文字, 每一个字符都有对应的唯一一个字符码, 这回大家都开心了� 但是, 针对于每个字符码, 使用几个字节存储的问题, 又存在几个不同的具体解决方案; 比如utf-8, utf-16, utf-32… 所以, 其实, 我们讨论这边编码的时候, 都是指Unicode编码

    • 获取更多资源,请关注微信公众号“百川一页”;
      百川一页
    • 或加入QQ群:635040761(请注明来源)
      Python进化群二维码.png

    相关文章

      网友评论

        本文标题:02-Python中文乱码

        本文链接:https://www.haomeiwen.com/subject/osziuxtx.html