zoukankan      html  css  js  c++  java
  • Day08字符编码

    Day08:

    知识储备:

    硬盘:由硬盘加载到内存,cpu从内存中取

    软件产生的数据都是先保存在内存中

    文件,输入文字,保存到内存,内存是硬件,硬件只能保存2进制,所以需要转换

    文本编辑器,输入文字的时候,是一个转成二进制保存到内存,然后反解成文字显示到屏幕的过程

    字符编码:
    将字符转换/编码成二进制
    为什么要用字符编码:
    计算机硬件是基于电工作的,只可以识别0,1二进制数,为了使用更便捷的使用计算机,需将人类的语言转换成二进制,毕竟我们不能以二进制与计算机沟通

    第一台计算机是美国人发明的,最初的编码为ascii码,只可以识别英文字符,那个时候并不存在乱码问题,因为程序到内存,内存到硬盘的编码原则仅有ascii码一种
    英文字符加上符号有120种左右,使用7位二进制数就可以将他们一一对应,考虑到后续扩展问题,采用了8个二进制位代表一个字符,1个字节 =8bit,1个英文字符占一个字节

    各国都需要使用计算机,都创造了各自的编码规则
    中国的gbk编码规则,用1个字节代表一个英文字符,用2个字节代表1个中文字符
    各国创建的编码规则除了识别自己的语言都兼容英文

    规则的不同,导致了各国只能在本国使用计算机,为了解决这个问题,产生了万国码unicode

    unicode字符编码表:
    建立时考虑的问题:
    可以输入万国语言,可以对应各国二进制
    1.字符与二进制的对应关系
    2.与各种字符编码的二进制数字都有对应关系
    但是unicode有一个弊端,就是统一使用2个字节来表示1个字符,如果都是英文字符的话,这将导致读取效率变低

    故产生了utf-8 编码原则,utf-8 采用1个字节表示英文字符,3个字节表示1个中文字符
    utf -8 提高了从内存到硬盘的存取效率,但也带来了弊端
    我们从程序存入内存的编码固定为unicode,这个是不可改的
    而我们从内存存到硬盘中可以是gbk,ascii,utf-8编码,这就导致了我们可能以一种编码存,另一种编码取,这将导致乱码问题

    解决乱码问题的核心:
    1.字符当初以什么编码存的,就应该以什么编码去读
    2.保证运行python程序的前两个阶段不乱码的解决方案:添加文件头
    在文件首行#coding :文件当初存的字符编码

    python2和python3
    我们知道:
    文本编辑器打开文件的过程:

    1.启动文本编辑器

    2.文本编辑器将文件内容读入内存

    3.将读入内存的内容显示到屏幕上

    python解释器执行一个py文件的三个过程

    1.启动python解释器

    2.将py文件的内容当做普通的文本文件读入内存,没有语法的概念

    3.解释执行

    文件编辑器和python解释器开个一个文件,在前两个环节都一样
    在第三阶段python代码中有数据类型str,也是字符,python解释器执行时,需要申请内存地址去放字符串
    这又涉及了编码原则,python3直接将字符串以unicode二进制存入,因为在我们从内存读取数据的时候,内存存放的就是字符串的unicode的二进制
    而python2 默认以ascii二进制将字符串存入内存,这样在取值的时候又存在乱码的隐患,python2中将字符串以unicode二进制方式存入内存的方法为在字符串前加小写u
    例s = u“haha”

  • 相关阅读:
    webpack打包注意事项
    打印内存, 打印16进制
    c++ 字符集转换
    RegSvr32 加载失败,找不到指定的模块
    错误码设计
    mfc 移动绘制的图形
    获取、设置光标
    c++ 函数中定义函数
    python linux 自动补全 tab.py
    3.4.5节 完整神经网络样例程序
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10009653.html
Copyright © 2011-2022 走看看