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

    字符编码

    一、文本编辑器存取文件的原理

    1. 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失。
    2. 要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。
    3. 在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。

    二、Python解释器执行py文件的原理

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

    三、Python解释器与文件本编辑的异同

    • 相同点:Python解释器是解释执行文件内容的,因而Python解释器具备读py文件的功能,这一点与文本编辑器一样。
    • 不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会Python的语法,而Python解释器将文件内容读入内存后,可不是为了给你瞅一眼Python代码写的啥,而是为了执行Python代码、会识别Python语法。

    四、字符编码

    字符编码: 二进制 和 你所能认识的字符 之间的相互转换的一个过程

    必须经过一个过程:

    • 字符 -------->翻译过程 ------->数字

    总而言之,字符编码是将人类的字符编码成计算机能识别的数字,这种转换必须遵循一套固定的标准,该标准无非是人类字符与数字的对应关系,称之为字符编码表。

    涉及到字符编码的两个场景

    1. 一个Python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(Python文件并未执行,前两个阶段均属于该范畴)。
    2. Python中的数据类型字符串是由一串字符组成的(Python文件执行时,即第三个阶段)。

    字符编码解码、编码过程介绍

    一张图就能让你明白,骚不骚

    乱码分析

    首先明确概念

    • 文件从内存刷到硬盘的操作简称存文件
    • 文件从硬盘读到内存的操作简称读文件

    乱码的两种情况:

    • 乱码一:存文件时就已经乱码

    存文件时,由于文件内有各个国家的文字,我们单以shiftjis去存,
    本质上其他国家的文字由于在shiftjis中没有找到对应关系而导致存储失败。但当我们硬要存的时候,编辑并不会报错(难道你的编码错误,编辑器这个软件就跟着崩溃了吗???),但毫无疑问,不能存而硬存,肯定是乱存了,即存文件阶段就已经发生乱码,而当我们用shiftjis打开文件时,日文可以正常显示,而中文则乱码了。

    • 乱码二:存文件时不乱码而读文件时乱码

    存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选对正确的解码方式就ok了。

    保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。

    windows电脑的记事本默认为gbk编码,除此之外其他的软件默认编码为utf8

    Python2和3字符编码的区别

    python2用的是ascii, python3默认是utf8读取字符

    # coding:gbk会告诉python3解释器用gbk编码读取字符

    python3(了解)

    你看到的其实是unicode

    但是终端帮你把这个unicode的0和1做一个转换,从unicode转换成了终端能够识别的编码格式,然后变成中文

    # coding:gbk
    a = '中文'  # 用unicode编码存储了这堆0和1
    print(a)  # 010101010
    

    假设终端的默认编码是gbk , 认识 unicode编码的变量

    假设终端的默认编码是utf8,认识 unicode编码的变量

    Python2(了解)

    unicode + 指定的coding编码(str类型)

    # coding:gbk
    a = '中文'  # 用gbk编码存储了这堆0和1
    a = u'中文'  # 用unicode编码存储了这堆0和1
    print(a)
    

    终端是一个文本编辑器,会有默认编码.

    假设终端的默认编码是gbk , 认识 gbk编码的变量

    假设终端的默认编码是utf8, 不认识 gbk编码的变量

  • 相关阅读:
    软件设计的哲学:第十七章 一致性
    软件设计的哲学:第十六章 修改现有代码
    软件设计的哲学: 第十五章 先写注释
    软件设计的哲学:第十四章 选个好名字
    软件设计的哲学:第十三章 注释应该描述代码中隐藏的内容
    软件设计的哲学:第二十章 为什么要写注释
    软件设计的哲学:第十一章 两次设计
    软件设计的哲学: 第十章 定义不存在错误
    软件设计的哲学: 第九章 合并还是分解
    软件设计的哲学:第八章 降低复杂性
  • 原文地址:https://www.cnblogs.com/dadazunzhe/p/11317365.html
Copyright © 2011-2022 走看看