python在进行字符串处理或者经过open函数读取文件时,常常会出现编码的错误:UnicodeDecodeE-rror: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not inpython
range(128)这个是因为python在进行编码和解码的过程当中,出现编解码不兼容时致使的错误。因此如今须要对字符的编码有个清晰的认识,不须要对编解码内部的内容进行深刻的研究,只须要了解相关编码规则,在之后再遇到这样的问题时能够本身进行相关的处理就行。ide
首先咱们须要明确一点,计算机内部存储所有采用的是0,1编码,并非以咱们看到的字符形式出现的,好比1,2,3,汉字等这种形式进行存储的,计算机不认识汉字或者字符,只认识0或者1,那么这些汉字或者字符是怎么出现的呢,就是咱们人为的为每一个字符进行一个特殊的编码,而后再进行解码,在终端或者文件中才能显示出咱们所熟悉的字符或者汉字,而不是0或者1。函数
一、如今的字符编码格式有ASCII编码,Unicode编码,UTF-8编码编码
1.1 ASCII编码 spa
这是美国为了英文字符采用的一种编码格式,共有128个字符包括数字,大小写字符以 及算术运算符 和逻辑运算符,其中还包括32个不能打印的特殊字符好比空格,tab键,换行符等。他们发现采用一 个字节的数量就能够表示完这128个字符,由于一个字节有8个位,在这8个位上采用0或者1,则能够 表示的状态有2的8次幂共有256个,则每个状态表示一个字符彻底能够胜任。那他们就采用低7位 用来表示这些字符,最高位用0来表示。对于英文而言ASCII已经可以胜任,能够加快经过计算机进行 信息交流的速度code
1.2 Unicode编码orm
ASCII编码只适用英文字符,可是世界上的语言不少,ASCII已经不能胜任了,好比中文,ASCII是不 可能进行编码的,所以咱们国家采用的编码时GB2312,后续还有不少标准。可是世 界上的语言很 多,人们就想着能不能采用一种统一的编码方式,把世界上全部的编码格式都惟一的进行标 示 unicode编码就应运而生了,对,它就是用来对世界上全部的文字进行编码的标准。ci
unicode编码采用的编码格式有UCS-8,UCS-16,UCS-32,他们采用固定的字节来标示字符进行编码。unicode
1.3 UTF-8编码字符串
全称为(Unicode Transformation Format)经过全称咱们就能够发现,其实UTF-8编码是以一个字节 为单位对unicode进行编码。须要说明的一点是UTF-8编码和unicode编码是不一 样的编码方式。
以下表格:
Unicode编码(16进制) | UTF-8 字节流(二进制) |
000000 – 00007F | 0xxxxxxx |
000080 – 0007FF | 110xxxxx 10xxxxxx |
000800 – 00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000 – 10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
二、python的编码处理
能够把python比做一个水池,这个水池中有一个入口和一个出口,而这个水池中对字符串采用的处理编码方式是unicode的,那么在入口处须要对输入进去的字符进行解码操做,解码采用的是decode()函数,能够采用decode(这里须要填写此文件的编码方式),而后经过unicode相关的库函数对字符串进行处理,在输出端,须要把输出的数据进行编码成咱们想要的格式进行存储,采用的函数是encode(参数是咱们想要的编码格式),对于unicode码和咱们想要输出的编码格式有重复的字符时,能够不进行编码操做,好比数字,英文字符等,均可以直接进行存储的。
三、python源文件的编码格式
即xxx.py这个文件的编码格式采用的是ASCII编码,能够经过sys模块的getdefaultencoding()函数获取默认的编码格式,当咱们想要改变源文件的编码格式时,须要在源文件开头的地方输入# _*_ coding: UTF-8进行编码操做来改变源文件的编码格式或者还能够经过sys模块的函数setdefaultencoding()来设置源文件的编码格式。