zoukankan      html  css  js  c++  java
  • day08

    字符编码

    • 什么是字符编码

    字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。

    计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的磁特性也是同样的道理。结论:计算机只认识数字。

    很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?

    • 内存为什么不用utf8?

    ​ 只有Unicode编码才能运行其他国家硬盘中的代码,而UTF-8的代码无法进行该操作。

    • 乱码的两种情况

    ​ 存文件时就已经乱码

    ​ 读文件时乱码

    • 涉及到字符编码的两个场景
    1. 一个Python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(Python文件并未执行,前两个阶段均属于该范畴)。

    2. Python中的数据类型字符串是由一串字符组成的(Python文件执行时,即第三个阶段)。

    • 字符编码的发展史

    ​ 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

    ​ ascii用1个字节(8位二进制)代表一个字符;Unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节。

    ​ 中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符与数字的对应关系。

    ​ 键盘 发送的是电流 --> 主机(内存)接收到电流(当作01010101010) --》 显示屏 接收电流(当作01010101010

    ​ 文本编辑器存储信息的过程文本编辑器 --》 写文本 --》 存储信息显示屏(内存) --》(转换)硬盘

    • 总结
    1. 保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。
    2. 在内存中写的所有字符,一视同仁,都是Unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是Unicode转换成其他编码格式的过程了。简而言之,就是内存中固定使用的就是Uncidoe编码,我们唯一能改变的就是存储到硬盘时使用的编码。

    ​ Unicode----->encode(编码)-------->gbk
    ​ Unicode<--------decode(解码)<----------gbk

    Python2和Python3编码的区别

    coding:gbk print('中文‘) # 用gbk写的

    python2默认用acill读取字符

    python2有两种存储变量的形式,第一种:unicode;第二种:按照coding头来的
    
    假设python2用utf8存储`x='中文'`,当你`print(x)`的时候,终端接收gbk的变量x,但是windows终端编码是utf8,会乱码
    
    假设python2用unicode存储,终端接受的是unicode,windows终端编码是utf8还是gbk重要吗?不会乱码
    
    python3只有一种存储变量的形式,unicode
    
    python3用unicode存储,终端接收的是unicode,widonws终端编码是utf还是gbk不重要,不会乱码
    

    上节课回顾

    元组内置方法
    不可更改的列表,其他的和列表一模一样

    散列表

    字典内置方法

    1. 乱序 --》 python2中字典是乱序的,但是python3做了优化(本来是乱序的,但是在c这个层面做了不乱序的优化)
    2. key为什么是不可变的,假设key是可变的,

    [key]可以取值,也可以修改值

    get 获取值,没有默认None

    setdefault 有就不修改,没有就增加

    集合内置方法

    1. 去重 --》同样的值存的位置是一样的,拿到第一个就不会拿到第二个
    2. 乱序 --》插值是按照某种哈希算法随机插的
    3. 进行数学集合运算
      1. 交集 &
      2. 并集 |
      3. 差集 -
      4. 补集 ^

    add 添加

    remove 删除

    discard 删除

    深浅拷贝

    拷贝

    l2为l1的拷贝对象,则l1内部的所有数据类型变化,则l2变化

    浅拷贝

    l2为l1的浅拷贝对象,l1内部的可变数据类型变化,l2变化;l1内部的不可变数据类型变化,l2不变化

    深拷贝

    l2为l1的深拷贝对象,l1内部变化,l2永不变化。

  • 相关阅读:
    Java相关面试题总结+答案(二)
    Java相关面试题总结+答案(一)
    Java相关面试题总结
    jdk各个版本的新特性(jdk1.7,1.8,1.9)
    Java内存区域
    数据库一、二、三范式
    外部按钮控制video视频的播放暂停
    jquery获取div跟textarea标签内容
    JS获取系统时间及日期
    滚动条插件---jquery.nicescroll.js 简单使用
  • 原文地址:https://www.cnblogs.com/gfhh/p/11535569.html
Copyright © 2011-2022 走看看