zoukankan      html  css  js  c++  java
  • DAY02

    什么是字符编码

    把人类的字符翻译成计算机能认识的数字

    必须经过一个过程:
    字符--------(翻译过程)-------->数字
    这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码
    以下两个场景下涉及到字符编码的问题:
    1. 一个python文件中的内容是由一堆字符组成的(python文件未执行时)
    2. python中的数据类型字符串是由一串字符组成的(python文件执行时)

    字符编码的发展史

    阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII
    ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符。ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)。后来为了将拉丁文也编码进了ASCII表,将最高位也占用了。

    阶段二:为了满足中文,中国人定制了GBK
    GBK:2Bytes代表一个字符
    为了满足其他国家,各个国家纷纷定制了自己的编码。日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里。

    阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
    于是产生了unicode,统一用2Bytes代表一个字符,2**16-1=65535,可代表6万多个字符,因而兼容万国语言。但对于通篇都是英文的文本来说,这种编码方式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)。于是产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes

    需要强调的一点是:
    unicode:简单粗暴,所有字符都是2Bytes,优点是字符->数字的转换速度快,缺点是占用空间大。
    utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示。
    内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)。
    硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

    字符编码的使用

    无论是何种编辑器,要防止文件出现乱码(请一定注意,存放一段代码的文件也仅仅只是一个普通文件而已,此处指的是文件没有执行前,我们打开文件时出现的乱码)。
    核心法则就是,文件以什么编码保存的,就以什么编码方式打开。

    unicode------->encode('utf-8')----->bytes
    bytes--------->decode('utf-8')----->unicode

    python解释器执行py文件的原理

    第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器
    第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)
    第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码(ps:在该阶段,即执行时,才会识别python的语法,执行文件内代码,执行到name="PatHoo",会开辟内存空间存放字符串"PatHoo")

  • 相关阅读:
    flask-admin章节二:wtforms的使用以及在数据库场景中使用QuerySelectField代替SelectField
    flask-admin章节一:使用chartkick画报表
    flask-admin众博客概述
    python smtplib发送邮件遇到的认证问题
    python logging模块可能会令人困惑的地方
    Markdown
    SpringBoot-启动过程
    SpringBoot-目录
    AbstractQueuedSynchronizer
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/hugengfeng/p/7365702.html
Copyright © 2011-2022 走看看