码迷,mamicode.com
首页 > 编程语言 > 详细

Python8_关于编码解码和utf-8

时间:2019-07-09 22:25:49      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:字符   --   表示   产生   字母   方法   原来   全面   事先   

关于编码:
ASCII码是早期的编码规范,只能表示128个字符。7位二进制数表示

扩展ASCII码,由于ASCII码不够用,ASCII表扩充到256个符号,不同的国家有不同的标准;8位二进制数

Unicode 准确来说不是编码格式,而是字符集。这个字符集包含了世界上所有的符号
所有字符长度统一用16位表示,因此字符是定长的;

GB2312 在ASCII码表的基础上,小于127的字符意义与原来相同,而将大于127的字节连在一起,表示汉字
前一个字节从0xA1(161)到0xF7(247)共87个,称为高字节,后一个字节从0xA1(161)到0xFE(254)共94字节,称为低字节。
两者可组合处8000种组合。可以用来表示6763个简体汉字、数学符号、罗马字母,日文等;
127以下的称为半角字符,两个字节的编码称为全角字符;
简单而言,GB2312就是在ASCII基础上的简体汉字扩展;

GBK 是对GB2312的扩展,完全兼容GB2312,达到了21886个汉字和符号

GB18030 收录了70244个汉字和字符,更加全面,与GB2312-1980和GBK相兼容

UTF 有两个格式UTF-8 UTF-16,表示每次传输8个位还是16个位,UTF-8等编码体积比较大,占电脑空间多

======================================================

encode和decode:

 

编码(动词):按照某种规则(这个规则称为:编码(名词))将“文本”转换为“字节流”。而在python 3中则表示:unicode变成str

解码(动词):将“字节流”按照某种规则转换成“文本”。而在python3中则表示:str变成unicode

 


bytes主要是给计算机看的,string主要是给人看的
中间有个桥梁是编码规则,主要的趋势是utf8
bytes对象是二进制的,很容易转换成十六进制
string就是我们看到的内容,如‘abc‘


string经过编码encode,转换成二进制对象,给计算机识别,
bytes经过反编码decode,转化成string,给我们看。

python3中的str类型对象有点像Python2中的unicode
python3中的str是未编码的,str有一个encode方法,调用这个方法之后将产生一个编码后的byte类型字符串
byte类型字符串才支持decode。


str encode bytes
bytes decode str

记住python3中有两个类型:字符串类型(Unicode字符)、bytes类型

=======================================================

Python中编码、解码与Unicode的联系:
字符串在Python内部的表示是Unicode编码,因此,在做编码转换时,通常需要以Unicode作为中间编码,即先将其他编码的字符串解码(decode)成Unicode,再从Unicode编码(encode)成另一种编码。

在新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型(bytes)但是两个函数的使用方法不变:

        decode                  encode
bytes ------> str(unicode)------>bytes

例子:
u = ‘中文‘ #指定字符串类型对象u
str = u.encode(‘gb2312‘) #以gb2312编码对u进行编码,获得bytes类型对象str
u1 = str.decode(‘gb2312‘)#以gb2312编码对字符串str进行解码,获得字符串类型对象u1
u2 = str.decode(‘utf-8‘)#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字符串内容


文件读取问题:
假如我们读取一个文件,文件保存时,使用的编码格式,决定了我们从文件读取的内容的编码格式,例如,我们从记事本新建一个文本文件test.txt, 编辑内容,保存的时候注意,编码格式是可以选择的,例如我们可以选择gb2312,那么使用python读取文件内容,方式如下:

f = open(‘test.txt‘,‘r‘)
s = f.read() #读取文件内容,如果是不识别的encoding格式(识别的encoding类型跟使用的系统有关),这里将读取失败

‘‘‘假设文件保存时以gb2312编码保存‘‘‘
u = s.decode(‘gb2312‘) #以文件保存格式对内容进行解码,获得unicode字符串

‘‘‘下面我们就可以对内容进行各种编码的转换了‘‘‘
str = u.encode(‘utf-8‘)#转换为utf-8编码的字符串str
str1 = u.encode(‘gbk‘)#转换为gbk编码的字符串str1
str1 = u.encode(‘utf-16‘)#转换为utf-16编码的字符串str1


codecs进行文件的读取
python给我们提供了一个包codecs进行文件的读取,这个包中的open()函数可以指定编码的类型:

import codecs
f = codecs.open(‘text.text‘,‘r+‘,encoding=‘utf-8‘)  #必须事先知道文件的编码格式,这里文件编码是使用的utf-8
content = f.read()                                                #如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将将会产生错误
f.write(‘你想要写入的信息‘)
f.close()
====================================================
在python2中,python2的默认编码是ASCII码,在做编码转换时,通常需要以unicode作为中间编码,所以在python2中先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码

通常使用如下

str.decode(‘utf-8‘).encode(‘utf-8‘)


但是在python3中, 字符串的默认编码就是unicode,所以不需要解码,直接就可以编码成另一种编码

通常使用如下

str.encode(‘utf-8‘)
总之,python3中,decode是将其他编码解码成unicode编码,encode是将unicode编码成其他编码

====================================================

 

Python8_关于编码解码和utf-8

标签:字符   --   表示   产生   字母   方法   原来   全面   事先   

原文地址:https://www.cnblogs.com/grooovvve/p/11160744.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!