加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

字符编码

发布时间:2020-12-17 00:23:28 所属栏目:Python 来源:网络整理
导读:前言 想要完全理解python的字符编码,需要了解python代码运行的三个步骤。 先启动python解释器 python解释器将硬盘中的文件读入内存 python解释器开始翻译代码并执行(如对一个变量赋值) 因为计算机只能识别二进制,也就是一大推的010101011,而人类使用计

前言

想要完全理解python的字符编码,需要了解python代码运行的三个步骤。

  1. 先启动python解释器
  2. python解释器将硬盘中的文件读入内存
  3. python解释器开始翻译代码并执行(如对一个变量赋值)

因为计算机只能识别二进制,也就是一大推的010101011,而人类使用计算机都只能理解自己的语言,就像中国人只能理解汉语一样,计算机只能理解二进制一样。那么在汉语到计算机存储的二进制就会有一种转换关系,这就是字符编码产生的意义。

一个软件运行的时候,输入的字符都是首先产生在内存中的,为了各个国家都能够统一,所以内存中都使用Unicode映射字符,当需要保存在硬盘中的时候,在按照Unicode对各个国家的编码进行一次映射转换成各个国家的编码。

字符--》编码--》Unicode--》编码--》utf-8码 utf-8码--》解码--》Unicode--》解码--》字符

自美国人发明计算机起,计算机用的编码为ASCII码,一个字节占8bit,那么总共可以表示256种状态,而美国所有的字符加在一起只有120+,所以一个字节对英语来说是可以满足的。而随着计算机的发展和普及,慢慢的每个国家都需要一种编码,像中国有GBK、日本有ShiftJIS等等,这样一来,每个国家的发明的应用程序只能在自己国家内使用。为了改变这种现状,在1990年开始起草Unicode码,简称万国码,里面是一张超级大的对照表,包含了所有的编码集,比如:utf-8、gbk,shiftjis、iso-8859-1。回到python程序运行的第二步,python解释器将硬盘中的文件读入内存,因为现在计算机的内存都是Unicode,而硬盘中的文件的编码格式有很多种,所以需要将硬盘中的文件在读入内存的过程中解码为unicode,然后python在翻译执行代码。

在Python中有两种编码:分别为文件编码运行代码时定义字符串的编码

  • 文件编码

在运行任何一个程序时,都是在内存中产生数据,之后再决定是否保存数据。

假如运行pycharm来编写代码,我们输入的字符首先在内存中产生,而内存中的数据也是二进制,当编写结束需要保存的时候,需要把内存中的二进制转换成另一种二进制保存在硬盘中。而在python2和python3中分为两种情况。

python解释器默认的编码:

  • python2:ASCII
  • python3:UTF-8

为了跟上编码的改变,python3解释器默认的编码改为了UTF-8编码。而且python3中的字符都是Unicode码,当需要保存文件时,就要把Unicode码转为UTF-8码存储进硬盘。

Unicode Unicode是万国码,它的产生就是为了解决编码问题。Unicode统统用两个字节保存字符,不论是英文还是中文,那么为什么保存的时候不用Unicode直接保存呢?现在的硬盘价格已经很廉价了,是为了提高程序的运行速度。磁盘IO次数越少,运行效率越高。

UTF-8 UTF-8是Unicode的扩展编码,用一个字节表示一个英文字符,用三个字节表示中文字符。

三个变化

编写代码并且保存代码在计算机中需要经过三个步骤

编辑器中的字符--》内存中的Unicode--》硬盘中的UTF-8二进制 utf-8仅仅是把Unicode转换成另一种二进制。

python刚诞生的时候Unicode还没出生,所以python2的默认编码为ASCII,所以就会产生一些编码问题,特别是中文。因为ASCII并不能识别中文,所以在保存代码的时候,中文字符因为找不到而会在保存文件的时候损坏文件。

python2在代码的第一行加上代码声明就可以结局这个问题

# coding:gbk
x = '你好啊'
print(x)

这样在保存文件和读取文件的过程中就不会出现乱码问题了。

  • 代码运行定义变量产生的编码问题

这也分两种情况 在Python3中默认都是Unicode码保存在内存中的,当需要取值的时候,直接把内存中的Unicode取出来就行,不存在问题。 在Python2中定义的字符串在内存中默认用文件头声明的编码方式保存,但是当需要取值的时候,需要按照程序的编码来解码,比如在win就要按照gbk来解码,在linux就要按照utf-8来解码。

在python3中产生的字符串会自动转成Unicode存在内存里,而在python2中就直接按照头文件声明的编码存在内存里,比如头文件声明为gbk编码,那么就用gbk码存进内存,如果是utf-8,那么就用utf-8存进内存。

在python2中声明字符串的时候,在前面加个u,这样就会把字符串转成Unicode存进内存了。

不论在python2还是python3中,最好都能在头文件中声明编码为utf-8,特别的,在python2中定义一个字符串变量时,在前面加个u。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读