1. 文本文件的编码方式ASCLL和UTF-8

介绍一下文本文件的编码格式,在计算机中可以直接来查看文本文件的内容,但是在计算机中文本文件本质上同样是以二进制的方式来存储的.

那么文本文件中每一个字符到底是怎样用二进制来表示的呢?需要介绍两个计算机中的编码,一个是古老的ASCLL 编码,一个是UNICODE 编码.

那么先来看一下ASCLL 编码, 之所以说ASCLL 编码是古老的编码,是因为计算机最早是美国人发明的,美国人为了在计算机中使用自己熟悉的英语,就制定了ASCLL 编码方案,在ASCLL 编码中啊,使用一个字节来表示一个字符,在计算机中,一个字节就包含有8个0或者1,

python ascll代码表 python中ascll_Python

 

8 个0 或者1进行排列组合,一共有256种组合方式, 2的8次方,因此呢,ASCLL 编码定义的字符,一共就有256个,试想一下,美国人习惯使用的英语用256个字词能够描述吗?下面一张ASCLL 码表,在ASCLL 表中定义有大写的A到大写的Z,然后定义有小写的a到小写的z,英语只有26个字母,大小写加起来不过才50多个.

除此之外呢,还定义有数字0到数字9,同时在ASCLL 码表中, 还针对转义字符定义了一下,熟悉的\t横向制表符, \n换行, \r回车,转义字符,其实都是ASCLL 编码中早就定义好了.

python ascll代码表 python中ascll_python ascll代码表_02

 

美国人为了在计算机中使用英文, 制定了ASCLL编码,ASCLL编码中一共有256个字符,256个字符完全能够涵盖英文字母以及数字,.

汉字有数以万计个字符,那数以万计的字符显然不能够用256来涵盖,那因此UNICODE 这种编码就应运而生了,UNICODE 是一种编码,而在UNICODE 中有一种非常常见的编码格式叫做UTF-8,UTF-8是使用1~6个字节来描述一个字符的,对比一下,ASCLL 编码是使用一个字节描述一个字符,而UTF-8 最多可以使用6个字节来描述一个字符,意味着UTF-8涵盖的内容会更多, UTF- 8几乎涵盖了地球上所有地区的文字.

python ascll代码表 python中ascll_python ascll代码表_03

 

而汉字呢,绝大多数是使用三个字节来表示的,在UTF-8 这种编码格式中,汉字是使用三个字来表示的.

在最早接触Python 2的解释器并不支持中文, 因为Python 2的解释器默认使用的是ASCLL 编码,Python3的解释器默认使用的是utf 8编码格式,既然使用的是utf 8编码格式,这种编码格式几乎涵盖了世界上所有地区的文字,所以可以在Python 3中直接使用中文,但是不能在Python 2中直接使用中文.

python ascll代码表 python中ascll_python ascll代码表_04

 

 

2. 怎么在Python 2.x中使用中文

介绍一下怎么样在Python二中使用中文,刚刚接触Python时,一旦在程序中出现了中文,Python 2的解释器就不能够执行这个程序了, 因为啊Python的解释器默认使用的编码格式是ASCLL,而中文并不是ASCLL 编码格式定义的字符.

python ascll代码表 python中ascll_python ascll代码表_05

 

准备了两行非常简单的代码,第一行定义了一个字符串变量,这个字符串中包含有中文,然后呢使用Print 函数做了个输出,这两行代码是能够在Python 3下运行, 

python ascll代码表 python中ascll_python_06

 

确认一下,控制台输出了这两行代码,

python ascll代码表 python中ascll_python_07

但这两行代码不能在 下运行, 打开终端,在终端中使用Python 2的解释器来执行一下演练的代码,现在回车,回车之后报错了,

python ascll代码表 python中ascll_Python_08

 

告诉在第1行发现了语法错误,

python ascll代码表 python中ascll_编码格式_09

 

具体原因, 发现了非 ASCLL字符,

python ascll代码表 python中ascll_python ascll代码表_10

中文不是ASCLL 编码定义的字符,所以在程序中一旦包含了中文, 作为Python2的解释器,默认使用的是ASCLL 编码格式,所以呢,一旦发现中文, Python2 的解释器就拒绝执行了.

如果希望Python 2的解释器能够以UTF-8 这种编码格式来解析文件, 那么就需要在原文件的第一行,是第一行增加一个非常特殊的单行注释,

python ascll代码表 python中ascll_字符串_11

 

这行特殊的单行注释,就可以告诉python 2的解释器,在解析这个文件的时候,使用UTF-8 编码格式来解析,这个就是这一行单行注释的作用. 

在第1行先增加一个单行注释,coding就表示编码,然后跟上utf8,单行注释增加完成,看看这一行单行注释会不会影响Python3的解释器执行,

python ascll代码表 python中ascll_字符串_12

 

仍然能够正常输出,

python ascll代码表 python中ascll_编码格式_13

 

那现在再回到终端,按一下向上的键回车,hello世界, 已经输出在终端了,

python ascll代码表 python中ascll_编码格式_14

 

在Python2中支持中文,只需要在代码的第1行啊,增加一个特殊的单行注释, 当增加了这一行特殊的注释之后,Python解释器在解析程序的时候,就会使用utf 8来解释当前的程序了,这样呢,程序中如果出现了中文, Python2的解释器,同样也能够正常执行.
 

3. Python 2.x 处理中文字符串

介绍一下,在Python 2中怎么样处理带中文的字符串.

如果程序中包含中文,需要在第1行增加一个特殊的注释,这个注释呢,就可以让Python的解释器以utf 8的编码格式来处理文件,

python ascll代码表 python中ascll_Python_15

 

如果在开发中某一个字符串是包含中文的,单纯增加这个单行注释,Python的解释器在遍历字符串也好,对字符串切片也好,同样会以字节为单位来进行处理.

这个是上一小节完成的代码,那现在就写一个简单的循环,for c in hello_str , 然后再循环体内部,把字符c做一个输出,

python ascll代码表 python中ascll_python_16

 

现在执行一下程序,控制台输出一个字符,

python ascll代码表 python中ascll_python ascll代码表_17

 

一个字符一个字符输出, 中文呢,也是一个中文一个中文输出.这个是在Python3下运行.

但是这份代码在python2下运行会出现什么效果呢?打开终端,按一下向上来执行一下这份代码,回车,回车之后, hello会把每一个单词的每个字母做一个输出.

python ascll代码表 python中ascll_字符串_18

 

但是下方会输出几个小问号,现在来数一数,123456, 为什么会输出6个小问号啊?

python ascll代码表 python中ascll_Python_19

 

在utf8中,绝大多数的中文都是使用三个字节来记录的,所以每一个中文在输出时都会说出三个小问号.

虽然现在Python 2的解释器已经能够执行带中文的程序了,但是在遍历带中文字符串时,这种效果不是希望看到的, 同样希望看到在Python3下执行的效果, 那怎么样解决这个问题呢?

注意在引号前增加一个小写字母u,

python ascll代码表 python中ascll_字符串_20

 

这个u就能告诉python解释器, 这是一个utf8编码格式的字符串,这个u, 就有这个效果,

python ascll代码表 python中ascll_编码格式_21

 

现在对代码的改变仅仅增加了一个小写字母,现在在python 3 运行一下, 仍然能够逐个字符的遍历,

python ascll代码表 python中ascll_Python_22

 

现在再回到终端,按一下向上的键回车,

python ascll代码表 python中ascll_字符串_23

 

每一个中文都是一个单独的字符,这个就是在python 2 中针对带中文的字符串,一个特殊的处理细节.

如果需要针对字符串进行遍历或者切片, 那么就需要在定义字符串时在前面增加一个小写字母u,这个小写的字母u,就可以告诉解释器, 下面定义的字符串,是一个utf8编码格式的字符串,这样呢在遍历也好, 切片也好都可以正常的使用了.