字符编码

一丶知识储备

  在学习字符编码前我们要了解这么几个知识点

  1.1 三大核心硬件:cpu 内存 硬盘

  1. 软件运行前,软件的代码及其相关数据都是存放于硬盘中的
  2. 任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
  3. 软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘

  1.2 文本编辑器读取文件内容的流程

  1. 启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)
  2. 文件编辑器会将文件内容从硬盘读入内存
  3. 文本编辑器会将刚刚读入内存中的内容显示到屏幕上

  1.3 python解释器读取文件内容的流程

  1. 启动python解释器,此时就相当于启动了一个文本编辑器
  2. python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
  3. python解释器解释执行刚刚读入的内存的内容,开始识别python语法

二丶字符编码介绍

  1. 什么是字符编码表:字符编码表就是一张字符与数字对应关系的表
  2. 为什么要有字符编码表:人类在和计算机交互的时候用的都是人类语言,但是计算机只能识别二进制数,因此在人类的字符到计算机的数字肯定要经过一个过程:字符---->翻译--->数字 翻译的过程必须要有一个特定的标准,而这个标准就是字符编码表
  3. 字符编码表的发展历史:
    1. 一家独大ASCII表:只支持英文字符,采用8位二进制数对应一个英文字符串
    2. 百花齐放GBK表:只支持英文和中文字符,采用8位二进制数对应一个英文字符,16位对应一个中文字符    shift—JIS表,Euc—kr表
    3. 分久必和万国表:unicode 与万国字符都有对应的关系,内存中的编码表就是unicode,他的存在让任何国家的字符存在内存中都不会出现乱码问题
  4. 编码与解码:
    1. 编码:由字符串转换成内存中的unicode,以及由unicode转换成其他编码的过程,称为编码encodeencode
    2. 解码:由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decodedecode
  5. UTF-8的由来:unicode解决了在内存当中存取万国字符时乱码的问题,那在内存与硬盘之间的存取乱码又该如何解决呢:和解决内存中的乱码方法一样规定了在硬盘中读取操作时的编码—utf-8
  6. 字符串的应用:
    1. 内存中固定使用unicode无论输入任何字符都不会发生乱码 
    2. 我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了 
      1. 存乱了:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了  这是致命的会导致数据消失
      2. 读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了     
  7. python解释器执行文件的前两个步骤:前两个阶段和文本编译器相同是读取文件的过程,想要实现读不乱则必须将python解释器读文件时的编码格式设置文件当初写入到硬盘中的编码格式,如果没有设置python解释器就会使用默认的编码格式,py2默认为ACSII  py3默认为utf-8。
    #想要改动编码则在文件的第一行写上
    # coding: 当初文件写入硬盘时采用的编码格
  8. python解释器执行文件的第三个步骤:设置文件头的作用是保证运行python程序的前两个阶段不乱码,经过前两个阶段后py文件的内容都会以unicode格式存放于内存中。

    在Python3中,字符串类的值都是使用unicode格式来存储

    由于Python2的盛行是早于unicode的,因此在Python2中是按照文件头指定的编码来存储字符串类型的值的(如果文件头中没有指定编码,那么解释器会按照它自己默认的编码

    方式来存储‘上’),所 以,这就有可能导致乱码问题

# coding:utf-8
x = '' # x的值为untf-8格式的二进制
print(x) # 打印操作是将x的值,即utf-8格式的二进制交给终端,当终端收到后发现并不是unicode(只有unicode才与字符有对应关系),所以终端会执行操作:utf-8二进制---解码-->unicode格式的二进制,解码的过程终端会采用自己默认的编码,而在pycharm的终端默认编码为utf-8、windows下的cmd终端的默认编码为gbk,所以该打印操作在pycharm中显示正常,而在windows下的cmd中则乱码

# 在windows下的cmd中运行效果如下
C:UsersAdministrator>python2 E:aaa.py
涓

    python2后推出了一种补救措施,就是在字符串类型前加u,则会将字符串类型强制存储unicode,这就与python3保持一致了,对于unicode格式无论丢给任何终端进行打印,都可以直接对应字符不会出现乱码问题     # coding:utf-8 x = u'上' # 即便文件头为utf-8,x的值依然存成unicode

总结:  

1、内存固定使用unicode,我们可以改变的是存入硬盘采用格式
英文+汉字-》unicode-》gbk
英文+日文-》unicode-》shift-jis
万国字符》-unicode-》utf-8

2、文本文件存取乱码问题
存乱了:解决方法是,编码格式应该设置成支持文件内字符串的格式
取乱了:解决方法是,文件是以什么编码格式存如硬盘的,就应该以什么编码格式读入内存

3、python解释器默认读文件的编码
python3默认:utf-8
python2默认:ASCII

指定文件头修改默认的编码:
在py文件的首行写:
#coding:gbk

4、保证运行python程序前两个阶段不乱码的核心法则:
指定文件头
# coding:文件当初存入硬盘时所采用的编码格式


5、python3的str类型默认直接存成unicode格式,无论如何都不会乱码
保证python2的str类型不乱码
x=u'上'


6、了解
python2解释器有两种字符串类型:str、unicode
# str类型
x='上' # 字符串值会按照文件头指定的编码格式存入变量值的内存空间
# unicode类型
x=u'上' # 强制存成unicode

               

   

原文地址:https://www.cnblogs.com/bk134/p/12481931.html