• Python8_关于编码解码和utf-8


    关于编码:
    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编码成其他编码

    也就是说只要事先知道某文件的编码格式,用该编码格式打开该文件,则读取出来的字符串都是unicode编码(python读文件时自动将其他编码格式->unicode编码)。

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

  • 相关阅读:
    java几种数据的默认扩容机制
    web.xml配置详解
    Bootstrap文件上传组件
    JAVA四则运算算法
    Oracle 和 mysql 的批量操作Sql语句 的区别
    JAVA使用ItextPDF
    c# 状态机实现
    c++11模拟boost元占位符placeholder
    vs2012 函数参数内存对齐引发编译错误
    windows下matplotlib编译安装备忘
  • 原文地址:https://www.cnblogs.com/grooovvve/p/11160744.html
Copyright © 2020-2023  润新知